蓝桥杯 历届试题 分糖果
Java AC
思路:使用了两个数组,因为本索引的值更新方法是上一个数组值的一半加上本索引数组值的一半。所以这里使用另一个数组kfront来保存上一次老师发给小朋友之后的全是偶数值的数组。
代码如下:
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
//定义一个变量存放小朋友的总人数
int n = 0;
//定义变量保存老师总共补发的糖果数
int sum = 0;
//定义一个数组保存小朋友的糖果数
int k[] = new int[110]; //实际保存糖果数的数组
//保存原来手中糖果数的数组
int kfront[] = new int[110];
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
for(int index = 0;index < n;index ++) { //表示后边还有int类型的数
k[index] = sc.nextInt();//得到该位小朋友的糖果数
kfront[index] = k[index]; //将每一次用户输入的糖果数保存到原来手中糖果数的数组中
}
while(true) { //一直循环,直到所有小朋友的糖果数相同为止
//表示每一轮开始小朋友将自己手中的糖果分给左手边的小朋友
for(int i = 1;i < n;i ++) {
k[i] = k[i] / 2 + kfront[i - 1] / 2; //表示将一半给左手边小朋友
}
//最后将第一个孩子的糖果数加上最后一个孩子的糖果数的一半
k[0] = k[0] / 2 + kfront[n - 1] / 2;
//*********实际数组更新完毕**********
//循环寻找拥有奇数个糖果的小朋友(顺便更新kfront数组)
for(int i = 0;i < n;i ++) {
if(k[i] % 2 != 0) { //表示是奇数数组
k[i] += 1; //表示老师发给奇数个学生补充一个糖果
sum ++; //表示老师补充发放的糖果数加1
//而后更新对应的front数组
kfront[i] = k[i];
continue;
}
kfront[i] = k[i];//表示是偶数数组,直接更新数组即可
}
//假设都是相等的
boolean flag = true;
//循环判断是否所有的数都相等
for(int i = 1;i < n;i ++) {
if(k[i] != k[0]) {
flag = false; //表示有一个不相等就不行
break;
}
}
//表示都相等,此时跳出循环
if(flag == true) {
break;
}
}
//输出老师补发的所有糖果数
System.out.println(sum);
}
}