codeforces 659B Qualifying Contest

题目链接: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;
}
posted @ 2016-03-31 21:49  Gssol  阅读(232)  评论(0编辑  收藏  举报