在许多选举的问题上,并不是每个人都是一张票的,很多时候会由于每个人的权利不同导致每个人的话事权也不一样(可认为所拥有的票数)假设有选举人V1,V2...Vk,他们所拥有的票数分别为w1,w2...wk;并设优势联盟为所有选举人的一个子集且他们的总票数超过一半。而Vi拥有的权利指数为在有他的所有优势联盟中,他退出便能使优势联盟变为劣势联盟的次数。若Vi一个人的票数便已经超过一半,则称他为独裁者,我们认为这种选举是不公平的。现在,我们就是要看一个选举系统是否存在独裁,若不存在,求出每个选举人的权利指数。 输入:第一行为T,表示有T个案例!每个案例第一行为k,表示有k个选举人(1<k<=20),第二行为k个数,表示每个选举人所拥有的票数。 输出:若存在独裁,则输出"It's unfair!",否则输出每个选举人的权利指数。
程序:
// selection.cpp : Defines the entry point for the console application.
//
#include"StdAfx.h"
#include<stdlib.h>
#include<stdio.h>
#define K 5
void main()
{
char v[K][10]={"d1","d2","d3","d4","d5"};//人名
int w[K]={5,10,12,17,8};//每人拥有的票数
int TotalVoteNum=0;//总票数
int SemiTotalVoteNum=0;//半数票数
int index[K]; //投票指数
int i,j,k,h=0;
int midtemp=0;
//计算总票数
for(i=0;i<K;i++)
{
TotalVoteNum=TotalVoteNum+w[i];
index[i]=0;
}
//计算票半数
SemiTotalVoteNum=TotalVoteNum/2;
//判断是否存在独裁者,如果有退出显示,没有的话输出投票指数
for(j=0;j<K;j++)
{
if(w[j]>=SemiTotalVoteNum)
{
printf("It's unfair!");
getchar();
return;
}
}
for(i=0;i<K;i++)
{
midtemp=w[i];
for(h=0;h<K;h++)
for(k=h;k<K;k++)
{
if(k==i)
continue;
midtemp=midtemp+w[k];
if(midtemp>SemiTotalVoteNum)
index[i]=index[i]+1;
}
}
printf("人\t\t权利指数\n");
for(i=0;i<K;i++)
printf("%s\t\t%d\n",v[i],index[i]);
system("pause");
}