挑战编程 程序设计竞赛训练手册-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];
}
}