POJ 1828

之所以记录下这道题,是因为自己看了别人的想法才做出来的,感觉还算比较典型的题,就是根据“多关键字”,求出最大的元素。

这里的最大是指存在一个关键字是最大的。

 #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> using namespace std; int p[50001][2]; int cmp(const void *a,const void *b) { const int * p1=(const int *)a; const int * p2 = (const int *)b; if(p1[0]==p2[0])//这里要注意:如果(2,4)和(2,3)排序后是(2,4),(2,3),统计y时就会出现问题 return p1[1]-p2[1]; else return p1[0]-p2[0]; } void solve(int n) { int num=0; qsort(p,n,sizeof(int)*2,cmp); int max_v=p[n-1][1];//现在p中已经按照x坐标排序,这样从最后一个元素统计y坐标,标记当前最大的y坐标max_v,如果前面有点的y坐标>max_v,则出现了一个“猴王”,不存在其他点的y大于这个点的y. //而按照x排序后再进行统计的原因是保证“只要不存在y大于自己的y即可”,如果不排序,可能存在这样的情况:遇到某个点,虽然存在y值大于它的,但是它的x最大(注意x相等情况)的,排序后不会出现这样的情况,因为x递减顺序统计. num++;//初始化num,x最大的肯定时猴王 for(int i=n-2;i>=0;i--) { if(p[i][1]>max_v) { num++; max_v = p[i][1]; } } cout<<num<<endl; } int main() { int n; cin>>n; while(n!=0) { memset(p,0,sizeof(p)); for(int i=0;i<n;i++) { cin>>p[i][0]; cin>>p[i][1]; } solve(n); cin>>n; } } 

你可能感兴趣的:(ini)