这种题目要注意输入输出。
这类很考验输入的题目实在是磨人耐心。多亏了sstream这个神器。方便了不少。这里要注意使用gets()因为我们不知道有多少选票
另外,当剩下的人的选票都一样的时候,就是平局,这个时候要输出每一个人的名字。
代码跑了500多ms,慢死了。。。。。后期处理数据的时候各种不优化,效率低下
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<sstream>
using namespace std;
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b)
#define MAXN 22
#define INF 0x3F3F3F3F
int n;
char mis[MAXN][200];
bool jud[MAXN];
int g[1300][50];
queue<int> q1,q2; //q1保存被淘汰的人 q2保存胜利的人
void solve()
{
scanf("%d",&n);
getchar();
for(int i=1;i<=n;i++)
{
jud[i]=false;
gets(mis[i]);
}
char buf[9000];
int m=0;
while(gets(buf))
{
int tmp;
if(buf[0]=='\0') break;
stringstream ss(buf); //sstream
for(int i=1;i<=n;i++)
ss>>g[m][i];
m++;
}
int tes=0,maxs,mins,maxid,cnt[MAXN],k=n;
while(1)
{
memset(cnt,0,sizeof(cnt));
maxs=0,mins=INF,maxid=0;
for(int i=0;i<m;i++) //统计选票
{
int p=1;
while(jud[g[i][p]]) p++;
cnt[g[i][p]]++;
}
while(!q1.empty())
q1.pop();
while(!q2.empty())
q2.pop();
for(int i=1;i<=n;i++) //找最大选票数,很最小选票数
{
if(jud[i]) continue;
if(mins>cnt[i])
{
while(!q1.empty())
q1.pop();
mins=cnt[i];
q1.push(i);
}
else
if(mins==cnt[i])
q1.push(i);
if(maxs<cnt[i])
{
while(!q2.empty())
q2.pop();
maxs=cnt[i];
maxid=i;
q2.push(i);
}
else
if(maxs==cnt[i])
q2.push(i);
}
if(q2.size()==k) //如果胜利的人等于剩下的人则是平局
{
for(int i=1;i<=n;i++)
{
if(jud[i]) continue;
cout<<mis[i]<<endl;
}
return;
}
if(maxs>(m+1)/2) //如果有人选票超过半数则直接输出
{
cout<<mis[maxid]<<endl;
return;
}
while(!q1.empty()) //将最后的人淘汰
{
int t=q1.front();
q1.pop();
k--;
jud[t]=1;
}
}
}
int main()
{
int t;
bool flag=0;
scanf("%d",&t);
while(t--)
{
if(flag) cout<<endl;
flag=1;
solve();
}
return 0;
}