2144 坐标统计代码优化

再补加一个代码优化:
2144 坐标统计
输入 n 个点在平面上的坐标(横纵坐标都是整数),对于每个点可以控制所有位于它左 下方的点(即横坐标 x 和纵坐标 y 都比它小),它可以控制的点的数目称为“战斗力”。依次 输出每个点的战斗力,最后输出战斗力最高的点的编号(如果若干个点的战斗力并列最高, 输出其中最大的编号)。
输入
输入第一行包含一个正整数 n(1≤n≤100),接下来的 n 行,每行描述一个点的坐标,第 i+1 行包含两个正整数 x 和 y(1≤x,y≤1000),表示编号为 i 的点的横坐标为 x,纵坐标为 y。
输出
输出共有 n+1 行,第 1 行到第 n 行,每行包含一个整数,第 i 行的整数表示编号为 i 的点的战斗力,第 n+1 行表示战斗力最高的点的编号。
输入样例

6
4 2
6 6
4 8
15 6
11 9
8 14

输出样例

0
1
0
1
3
3
6

代码一:

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int a[101],b[101],c[101];
int main()
{
    int n,s=0,x=1,max=0;
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i]>>b[i];
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(a[i]>a[j]&&b[i]>b[j])
            s++;
            c[x]=s;
            x++;

        }
        cout<<s<<endl;
        s=0;
    }
    for(int i=1;i<n;i++)
    {
        if(c[i]>c[i+1])
            max=i;
            else
                max=i+1;
    }
    cout<<max<<endl;
	return 0;
}

超时。。。

代码二:

#include <iostream>
using namespace std;
int main()
{
    int n,i,j,k,max=1;cin>>n;
    int x[n+1],y[n+1],s[n+1];
    for(i=1;i<=n;i++)cin>>x[i]>>y[i];
    for(i=1;i<=n;i++)
    {
    	k=0;
		for(j=1;j<=n;j++)
    	{
    		if(x[j]<x[i]&&y[j]<y[i])k++;
		}
		s[i]=k;cout<<s[i]<<endl;
		if(s[i]>=s[max])max=i;
	}
	cout<<max;
	return 0;
 } 

这两个代码没有什么太大差别。。。微小的区别是第一个多出一个循环,而第二个统计最大值时直接在一个循环体中求出记下了。真的是差别好小。。。但是第一个会超时,看来以后优化问题还要多多注意。。。

原文地址:https://www.cnblogs.com/study-hard-forever/p/12130074.html