题目链接:http://codeforces.com/problemset/problem/659/B
题意:
n个人,m个区。给出n个人的姓名(保证不相同),属于的区域,所得分数。从每个区域中选出成绩最好的两个人去参加比赛,输出这两个人的名字。如果第三个人的成绩和第二个人的成绩相同,则输出“?”,保证结果不确定。
解题思路:
刚开始想用个什么STL容器把这三个属性存进去,然后根据区域的不同对每个区域的选手的分数进行排序,最后看选手确定,输出答案。
可是做比赛的时候没有想到应该用什么STL容器。
然后想到了用结构体。
结构体里面有选手的三个信息,然后对结构体进行排序。
交上去发现错了,后来发现是自己在写判断条件的时候出错了。对于判断条件与思路一定要条理清晰才不容易出错。
具体代码如下:
#include<bits/stdc++.h> using namespace std; struct p { string s; int num; int scro; }P[200000]; bool cmp(p X,p Y) ///结构体排序 { if(X.num==Y.num) return X.scro>Y.scro; return X.num<Y.num; } int main() { int n,m,t1,t2; string s1; scanf("%d %d",&n,&m); for(int i=0;i<n;i++) ///读入数据 { cin>>P[i].s>>P[i].num>>P[i].scro; } sort(P,P+n,cmp);///对数据按照一定的规则进行排序 for(int j=1;j<=m;) { for(int i=0;i<n;i++) { if(P[i].num==j) ///这里的判断条件一定要很清楚,不然容易出错。 { if(P[i+1].num==j) { if((P[i+2].num==j&&P[i+1].scro!=P[i+2].scro)||(P[i+2].num!=j)) cout<<P[i].s<<" "<<P[i+1].s<<endl; else cout<<"?"<<endl; } else { cout<<"?"<<endl; } j++; } } } return 0; }