裸题。但我看了题解才照着写出来,难点在输入和存储数据部分。模拟选举相对简单容易,只要开个数组记录下淘汰的候选人即可。
学到了一些知识:读入字符串最好用gets;isdigit判断字符是否为数字。
/*Written by Henry.Witt.Joker*/
/*22/05/2012 01:35*/
/*Verdict: Accepted*/
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<ctype.h>
using namespace std;
typedef struct Vote
{
char name[81];
int ballot[21];
};
Vote elect[1001]={0};
char info[1001]={'\0'};
int vis[1001]={0};
int m,n;
void read()
{
int len,tmp,s;
m=0;
while (gets(info)!=NULL)
{
if (!isdigit(info[0])) break;
s=tmp=0;
len=strlen(info);
for (int i=0;i<len;i++)
if (isdigit(info[i])) tmp=tmp*10+(info[i]-'0');
else
{
elect[m].ballot[s++]=tmp;
tmp=0;
}
m++;
}
}
void work()
{
int candidate=n,allvotes,maxx,minn;
int addup[21]={0};
while (candidate>1)
{
allvotes=0;
memset(addup,0,sizeof(addup));
for (int i=0;i<m;i++)
for (int j=0;j<n;j++)
if (!vis[elect[i].ballot[j]])
{
allvotes++;
addup[elect[i].ballot[j]]++;
break;
}
for (int i=1;i<=n;i++)
if (!vis[i]&&addup[i]*2>allvotes)
{
printf("%s\n",elect[i-1].name);
return;
}
minn=99999999;
maxx=0;
for(int i=1;i<=n;i++)
if(!vis[i])
{
if (minn>addup[i]) minn=addup[i];
if (maxx<addup[i]) maxx=addup[i];
}
if(minn==maxx) break;
for(int i=1;i<=n;i++)
if(addup[i]==minn)
{
candidate--;
vis[i]=1;
}
}
for(int i=1;i<=n;i++)
if(!vis[i]) printf("%s\n",elect[i-1].name);
}
int main()
{
int cas,i;;
scanf("%d",&cas);
while (cas--)
{
scanf("%d\n",&n);
for (i=0;i<n;i++) gets(elect[i].name);
read();
memset(vis,0,sizeof(vis));
work();
if (cas) printf("\n");
}
return 0;
}