编程算法测试题
给出全班同学的成绩单,按照固定顺序排好,向每位学生发糖果,每人最少一颗糖,保证相邻学生中
分数高的糖果多,分数少的糖果少,求出最优条件下,即发出的总糖果最少时,需要的总糖果数。
例:分数90,88,85,87,83,80;则糖果分3,2,1,3,2,1=12
自己写的没考虑复杂度问题,虽然比较low,但先记下来吧
package test; import java.util.Scanner; public class Math1 { static int number=20; public static void main(String[] args) { System.out.print("请输入全部学生成绩,以逗号分隔: "); Scanner a = new Scanner(System.in); String str[]=a.next().split("\D+"); int grade[]=new int[number];//学生成绩数组 //输出全部学生成绩 System.out.print("每个人的成绩为: "); for(int i=0;i<str.length;i++) { grade[i]=Integer.parseInt(str[i]); System.out.print(grade[i]+" "); } System.out.println(""); //调用分配糖果函数,得到每个人的糖果数,并输出 int candy[]=deliverCandy(grade); int sum=0;//总糖果数 System.out.print("每个人的糖果数: "); for(int i=0;i<candy.length;i++) { System.out.print(candy[i]+" "); sum+=candy[i]; } System.out.println(""); System.out.println("需要的总糖果数为: "+sum); } //分糖果函数 public static int[] deliverCandy(int grade[]) { int candy[]=new int[number]; //--------------------------------1.直接赋成绩值---------------------------// for(int i=0;i<number;i++) { candy[i]=grade[i]; } if(candy[0]>candy[1]) { candy[0]=100; }//首位值设定:大于旁边值则100,小于则1 else{candy[0]=1;} if(candy[number-1]>candy[number-2]) { candy[number-1]=100; } else{candy[number-1]=1;} //--------------------------------2.顺序循环------------------------------// for(int i=1;i<number-1;i++) { if(candy[i]<candy[i-1] && candy[i]<candy[i+1])//波谷 { candy[i]=1; } else if(candy[i]>candy[i-1] && candy[i]>candy[i+1])//波峰 { candy[i]=100; } else { candy[i]=min(candy[i-1],candy[i+1])+1; } System.out.print(candy[i]+" "); }System.out.println(""); //--------------------------------3.逆序循环------------------------------// for(int i=number-2;i>0;i--) { if(candy[i]<candy[i-1] && candy[i]<candy[i+1])//波谷 { candy[i]=1; } else if(candy[i]>candy[i-1] && candy[i]>candy[i+1])//波峰 { candy[i]=100; } else { candy[i]=min(candy[i-1],candy[i+1])+1; } System.out.print(candy[i]+" "); }System.out.println(""); //----------------------------4.将100替换为max+1 ----------------------------// for(int i=1;i<number-1;i++) { if(candy[i]==100){ candy[i]=max(candy[i-1],candy[i+1])+1; } } if(candy[0]==100) { candy[0]=candy[1]+1; } if(candy[number-1]==100) { candy[number-1]=candy[number-1]+1; } return candy; } //求左右的最小值 static int min(int a,int b) { int c; if(a>b){c=b;} else{c=a;} return c; } //求左右的最大值 static int max(int a,int b) { int c; if(a<b){c=b;} else{c=a;} return c; } }
【例】输入数据为:99.95.87.75.88.83.84.85.89.78.68.78.98.76.65.75.80.75.86.76
打印输出:
请输入全部学生成绩,以逗号分隔: 99.95.87.75.88.83.84.85.89.78.68.78.98.76.65.75.80.75.86.76
每个人的成绩为: 99 95 87 75 88 83 84 85 89 78 68 78 98 76 65 75 80 75 86 76
88 76 1 100 1 2 3 100 69 1 2 100 66 1 2 100 1 100
100 1 100 2 1 2 100 2 1 2 100 3 2 1 100 1 2 3
每个人的糖果数: 4 3 2 1 2 1 2 3 4 2 1 2 3 2 1 2 3 1 2 1
需要的总糖果数为: 42