UVa 10142 - Australian Voting

题目:澳大利亚选举。有n个候选人m个公民,每一个公民对每一个候选人有一个期望的优先级,

            选举时,先按第一优先级分配选票。得票最少的候选人的投票,将按投票人的优先级,

            又一次分给留下的候选人,直到某人获得50%或以上的选票。或者剩下的人得票同样。

            求选举结果。

分析:模拟。依照上述规则模拟就可以。过程有点麻烦。

说明:数据给事有点恶心,注意到达50%就能够觉得胜利了。不用超过╮(╯▽╰)╭。

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>

using namespace std;

char candidate[21][81];
char buf[1001];
int  choice[1001][21];
int  vote[21][1001];
int  vote_size[21];

int main()
{
	int t,n;
	while (~scanf("%d",&t)) 
	while (t --) {
		scanf("%d",&n);
		getchar();
		for (int i = 0; i < n; ++ i) {
			gets(candidate[i]);
			vote_size[i] = 0;
		}
		//提取每一个公民的投票意向 
		int number = 0;
		while (gets(buf) && buf[0]) {
			int value = 0, count = 0;
			for (int i = 0; buf[i]; ++ i) 
				if (buf[i] >= '0' && buf[i] <= '9') {
					value *= 10;
					value += buf[i]-'0';
				}else {
					choice[number][count ++] = value-1;
					value = 0;
				}
			choice[number ++][count ++] = value-1;
		}
		//初始化 
		for (int i = 0; i < number; ++ i) {
			int cand = choice[i][0];
			vote[cand][vote_size[cand] ++] = i;
		}
		
		while (1) {
			int max = 0, min = 1001, max_space, min_space;
			for (int i = 0; i < n; ++ i)
				if (vote_size[i]) {
					if (max < vote_size[i]) {
						max = vote_size[i];
						max_space = i;
					}
					if (min > vote_size[i]) {
						min = vote_size[i];
						min_space = i;
					}
				}
			if (max*2 >= number) break;//等于 50%也能够 
			if (max == min) break;
			for (int k = 0; k < n; ++ k) {
				if (vote_size[k] != min) continue;
				//取出得票最少的人的选票s 
				for (int i = 0; i < vote_size[k]; ++ i) {
					int per = vote[k][i];
					//又一次按意向分配当前公民选票 
					for (int j = 0; j < n; ++ j) {
						int can = choice[per][j];
						if (vote_size[can] != min && vote_size[can]) {
							vote[can][vote_size[can] ++] = per;
							break;
						}
					}
				}
				vote_size[k] = 0;
			}
		}
		
		int max_space = 0;
		for (int i = 0; i < n; ++ i)
			if (vote_size[max_space] < vote_size[i])
				max_space = i;
		for (int i = 0; i < n; ++ i)
			if (vote_size[max_space] == vote_size[i])
				puts(candidate[i]);
		if (t) puts("");
	}
    return 0;
}
一些測试数据:

2

3
John Doe
Jane Smith
Sirhan Sirhan
1 2 3
2 1 3
2 3 1
1 2 3
3 1 2

3
John Doe
Jane Smith
Sirhan Sirhan
1 2 3
2 1 3
2 3 1
1 2 3

1

4
A
B
C
D
2 1 3 4
2 1 3 4
3 1 4 2
4 1 2 3


转载于:https://www.cnblogs.com/jzdwajue/p/7295353.html

在Python中,要导入并使用名为“fpp”的包,你需要首先确保这个包已经被安装在你的Python环境中。在编写我的回答时,我必须提到在大多数情况下,“fpp”并不是一个标准的Python包,它可能是一个特定的库或者是某个特定环境下的包。这里我假设你提到的“fpp”可能是指用于时间序列分析的“fpp2”包(也称为“Forecasting: Principles and Practice”),它是一本同名在线书籍的配套包,其中包含了澳大利亚啤酒生产数据集。 如果“fpp”是“fpp2”包,你可以按照以下步骤导入数据集并输出1956-2008年之间的数据: 1. 首先安装“fpp2”包。你可以使用pip进行安装(如果该包存在于PyPI上): ```bash pip install fpp2 ``` 2. 如果“fpp”是一个非标准包,可能需要通过其他方式安装,比如从特定的源或使用特定的安装命令。 3. 安装完成后,你可以使用以下Python代码导入“fpp”包并访问“ausbeer”数据集: ```python from fpp2 import ausbeer import pandas as pd # 查看数据集的时间范围 print("数据集的时间范围从 {} 到 {}".format(ausbeer.index.min(), ausbeer.index.max())) # 使用Pandas提取1956-2008年之间的数据 ausbeer_1956_2008 = ausbeer['1956-01-01':'2008-12-31'] print(ausbeer_1956_2008) ``` 以上代码假设“fpp”包使用了Pandas库来处理时间序列数据,因此可以直接利用Pandas的索引功能来筛选时间范围内的数据。 请记住,由于“fpp”不是一个通用的包名,上述代码和步骤可能并不适用于你的情况。如果“fpp”是一个自定义包或者是一个特定环境下的包,你可能需要使用不同的方法来安装和导入数据集。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值