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;}
阅读全文
0 0