uva10142

来源:互联网 发布:中小学网络答题活动 编辑:程序博客网 时间:2024/06/05 22:33
#include <iostream>#include <stdio.h>#include <queue>#include <cstring>#include <algorithm>using namespace std;queue<int> q[1010];struct candidate{    char name[90];    int num;    int cnt;    bool operator <(const candidate c)const    {        if(cnt==c.cnt) return num>c.num;        return cnt<c.cnt;    }} can[21];bool e[21];int n,m;void erase_(int x){    //cout<<x<<endl;    for(int i=1; i<=m; i++)        if(q[i].front()==x)        {            int tmp=q[i].front();            while(e[tmp])            {                q[i].pop();                tmp=q[i].front();            }          //  cout<<tmp<<endl;            for(int i=1; i<=n; i++)                if(can[i].num==tmp)                {                    can[i].cnt++;                    break;                }        }}void solve(){    int w=100;    int t=1;    for(int i=1;i<=m;i++)        can[q[i].front()].cnt++;    //for(int i=1;i<=n;i++) cout<<can[i].cnt<<" ";    while(1)    {        sort(can+t,can+1+n);       // for(int i=1;i<=n;i++) cout<<can[i].cnt<<" ";       // cout<<endl;        if(w--==0)return ;        if(can[t].cnt==can[n].cnt) break;        if(can[n].cnt*2>=m) break;        int j;        //cout<<t<<endl;        for(j=t; j<=n; j++)        {            if(can[j].cnt!=can[t].cnt) break;            e[can[j].num]=true;        }        t=j;        for(int i=1;i<=n;i++)            if(e[i]) erase_(i);        //for(int i=1;i<=n;i++) cout<<can[i].cnt;    }    cout<<can[n].name<<endl;    for(int i=n-1; i>=1 && can[i+1].cnt==can[i].cnt; i--)        cout<<can[i].name<<endl;}int main(){    //freopen("debug\\in.txt","r",stdin);   // freopen("debug\\out.txt","w",stdout);    int t;    cin>>t;    while(t--)    {        scanf("%d",&n);        getchar();        for(int i=1; i<=n; i++)        {            gets(can[i].name);            can[i].num=i;            e[i]=false;            can[i].cnt=0;        }        char vote[300];        m=0;        while(gets(vote) && vote[0])        {            int num;            m++;            int len=strlen(vote);            for(int k=0; k<len; k++)            {                num=0;                while(vote[k]!=' ' && vote[k]!='\0')                {                    num*=10;                    num+=vote[k]-'0';                    k++;                }                q[m].push(num);            }        }        solve();        if(t) cout<<endl;        for(int i=1;i<=m;i++)            while(!q[i].empty())q[i].pop();    }    return 0;}
原创粉丝点击