挑战编程 程序设计竞赛训练手册-1.6.8 澳大利亚投票(Australian Voting)

挑战编程 程序设计竞赛训练手册-1.6.8 澳大利亚投票(Australian Voting)

 

public class problem_Australian_Voting {

	/**1.略有Bug--所有票数相同则不显示
	 * 2.数据越多,差距越多最好,正常投票都有参差
	 * 3.用递归循环,遇到获胜者时不能return,改用了while判断
	 * 4.此题人名,票数等皆不固定,程序不能写死,只能按照输入的第一行的 n 来拓展
	 * 5.人名、选票总数、选票序号之间的关联需谨慎对待
	 * 6.此题变量很多,有许多输出行检测变量
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String[] vote = {
			"3",
			"John Doe",
			"Jane Smith",
			"Jane Austen",
			"1 2 3",
			"2 1 3",
			"2 3 1",
			"1 2 3",
			"3 1 2"
		};
		String theWinner = prepare(vote);
		System.out.println(theWinner);
	}

	private static String prepare(String[] vote) {
		// TODO Auto-generated method stub
		boolean flag=true;
		String winner="Goon";
		while(flag){
		int member;
		int highvote;
		member = Integer.parseInt(vote[0]);//字符串组的第一位为候选人人数
		int voteArray[] = new int[member];//定义长度等于候选人数的数组
		String name[] = new String[member];//创建字符串组,保存候选人
		
		for(int i=0;i<name.length;i++){//读取候选人
			name[i] = vote[i+1];//保存候选人
			//System.out.println(name[i]);测试循环
		}
		for(int j=member+1;j<vote.length;j++){ //读取所有投票信息
			//System.out.println(vote[j]);//测试循环
			for(int i=1;i<=member;i++){//循环数组下标,即对应的候选人
				if(Integer.parseInt(String.valueOf(vote[j].toCharArray()[0]))==i){//如果第一位数子等于候选人下标,则此人选票+1
					voteArray[i-1]++;
					//System.out.println(i-1+" "+voteArray[i-1]);
				}
			}

		}
		int[] backupAray = new int[voteArray.length]; //为数组备份
		System.arraycopy(voteArray, 0, backupAray, 0, voteArray.length);
		highvote = orderVote(voteArray);//进行票选排序,返回最高票数
		//System.out.println(highvote);
		//System.out.println((vote.length-member-1)/2);//系统截断小数,因此要在此票数上+1才是超过半数票
		if(highvote>((vote.length-member-1)/2)){//如果最高意向票数大于选票数的50%,则此人获胜
			for(int i=0;i<backupAray.length;i++){
				//System.out.println(backupAray[i]);
				//System.out.println((highvote)==Integer.parseInt(String.valueOf(backupAray[i])));
				
				if((highvote)==Integer.parseInt(String.valueOf(backupAray[i]))){
					//System.out.println(i);
					winner = name[i];
					flag = false;
					//System.out.println(name[i]);
				}
				//System.out.println(backupAray[i]);
			}
		}else{//最高没有票数超过一半,则操作第一意向最少的候选者
			int lownum =0;//定义得最低票数候选人编号
			int[] backupArrayAgain = new int[backupAray.length]; //为数组备份
			System.arraycopy(backupAray, 0, backupArrayAgain, 0, backupAray.length);
			/*找出第一意向最少的候选者*/
			int lowvote = lowVote(backupAray);//找出最低票
			for(int i =0;i<backupArrayAgain.length;i++){
				if(backupArrayAgain[i]==lowvote){
					lownum=i;
				}
			}
			//System.out.println(lownum+1);
			
			for(int i=member+1;i<vote.length;i++){//把第一意向选择他的票数截断第一个数字和空格(可能不止一个最低)
				//System.out.println(vote[i].toCharArray()[0]);
				if(Integer.valueOf((String.valueOf(vote[i].toCharArray()[0])))==(lownum+1)){
					vote[i]=vote[i].substring(2, vote[i].length());
					//prepare(vote);//传入新的选票信息,递归prepare函数
					//直到出现最高意向票数大于选票数的50%的人为止
					//System.out.println(vote[i]);
				}
			}		
		  }
		}
		return winner;
	}
	
	private static int lowVote(int[] backupAray) {
		// TODO Auto-generated method stub
		for(int i=0;i<backupAray.length;i++){//查找最高的第一意向
			//System.out.println(voteArray[i]);
			//冒泡排序法,排序后backupAray[0]为最低票数
			for(int j=i;j<backupAray.length;j++){
				if(backupAray[i]>backupAray[j]){//由小至大排列
					int temp;
					temp = backupAray[i];
					backupAray[i]=backupAray[j];
					backupAray[j]=temp;
				}
			}
		}
		return backupAray[0];
	}

	private static int orderVote(int[] voteArray) {
		// TODO Auto-generated method stub
		for(int i=0;i<voteArray.length;i++){//查找最高的第一意向
			//System.out.println(voteArray[i]);
			//冒泡排序法,排序后voteArray[0]为最高票数
			for(int j=i;j<voteArray.length;j++){
				if(voteArray[i]<voteArray[j]){//由大至小排列
					int temp;
					temp = voteArray[i];
					voteArray[i]=voteArray[j];
					voteArray[j]=temp;
				}
			}
		}
		return voteArray[0];
	}
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值