UvaOJ 10142 - Australian Voting

裸题。但我看了题解才照着写出来,难点在输入和存储数据部分。模拟选举相对简单容易,只要开个数组记录下淘汰的候选人即可。

学到了一些知识:读入字符串最好用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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值