2014省赛糖果分配试题如何解答?

2026-06-10 04:191阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计687个文字,预计阅读时间需要3分钟。

2014省赛糖果分配试题如何解答?

:分糖果游戏 + 有n个小朋友围成一圈。老师给每个小朋友随机发几个糖果,然后进行下面的游戏:每个小朋友都将自己的糖果分一半给左手边的孩子。一轮分糖果后,拥有奇数个糖果的孩子出局。


标题:分糖果

  • 有 n 个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏:
    每个小朋友都把自己的糖果分一半给左手边的孩子。
    一轮分糖后,拥有奇数颗糖的孩子由老师补给个糖果,从而变成偶数。
    反复进行这个游戏,直到所有小朋友的糖果数都相同为止
    你的任务是预在已知的初始糖果情形下,老师一共需要补发多少个糖果。

  • 程序首先读入一个整数 N (2<N<100),表示小朋友的人数。
  • 接着是一行用空格分开的 N 个偶数(每个偶数不大于1000,不小于2)
  • 要求程序输出一个整数,表示老师需要补发的糖果数。
    输入:
    3
    2 2 4
    程序输出:
    4
public class Text08_分糖果 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt(); // 小朋友的人数
if ( n<2 || n>100 ) {
return;
}
int[] arr = new int[n]; // 记录每个小朋友的糖果数
int sweets;
for (int i = 0; i < arr.length; i++) {
arr[i] = input.nextInt();
if ( (arr[i]) < 2 || (arr[i]>1000) || (arr[i]%2==1) ) return; // 糖果数为偶数
}
int sum = 0;
while (true){
// 分糖果 --- 闭合的环
for (int i = 1; i < arr.length-1; i++) {
arr[i+1] = arr[i+1]/2; // 右边小朋友分出的一半糖果
arr[i] += arr[i+1]/2; // 左边小朋友获取分得的糖果
arr[i] = arr[i] / 2;
arr[i-1] += arr[i];
arr[i-1] = arr[i-1]/2;
arr[i+1] += arr[i-1];
}
// 老师补发糖果
for (int a:arr) {
if (a%2!=0){
a +=1;
sum++;
}
}
// 判断所有的小朋友糖果数是否相等
if (check(arr)){
System.out.println(sum);
break;
}
}
}
// 判断每个小朋友的糖果数是否相等
public static boolean check(int[] arr){
int m = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i]!= m) return false;
}
return true;
}
}

​​注意:这里是小朋友围坐成一圈,所以是个闭合的环!!!​​



2014省赛糖果分配试题如何解答?

本文共计687个文字,预计阅读时间需要3分钟。

2014省赛糖果分配试题如何解答?

:分糖果游戏 + 有n个小朋友围成一圈。老师给每个小朋友随机发几个糖果,然后进行下面的游戏:每个小朋友都将自己的糖果分一半给左手边的孩子。一轮分糖果后,拥有奇数个糖果的孩子出局。


标题:分糖果

  • 有 n 个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏:
    每个小朋友都把自己的糖果分一半给左手边的孩子。
    一轮分糖后,拥有奇数颗糖的孩子由老师补给个糖果,从而变成偶数。
    反复进行这个游戏,直到所有小朋友的糖果数都相同为止
    你的任务是预在已知的初始糖果情形下,老师一共需要补发多少个糖果。

  • 程序首先读入一个整数 N (2<N<100),表示小朋友的人数。
  • 接着是一行用空格分开的 N 个偶数(每个偶数不大于1000,不小于2)
  • 要求程序输出一个整数,表示老师需要补发的糖果数。
    输入:
    3
    2 2 4
    程序输出:
    4
public class Text08_分糖果 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt(); // 小朋友的人数
if ( n<2 || n>100 ) {
return;
}
int[] arr = new int[n]; // 记录每个小朋友的糖果数
int sweets;
for (int i = 0; i < arr.length; i++) {
arr[i] = input.nextInt();
if ( (arr[i]) < 2 || (arr[i]>1000) || (arr[i]%2==1) ) return; // 糖果数为偶数
}
int sum = 0;
while (true){
// 分糖果 --- 闭合的环
for (int i = 1; i < arr.length-1; i++) {
arr[i+1] = arr[i+1]/2; // 右边小朋友分出的一半糖果
arr[i] += arr[i+1]/2; // 左边小朋友获取分得的糖果
arr[i] = arr[i] / 2;
arr[i-1] += arr[i];
arr[i-1] = arr[i-1]/2;
arr[i+1] += arr[i-1];
}
// 老师补发糖果
for (int a:arr) {
if (a%2!=0){
a +=1;
sum++;
}
}
// 判断所有的小朋友糖果数是否相等
if (check(arr)){
System.out.println(sum);
break;
}
}
}
// 判断每个小朋友的糖果数是否相等
public static boolean check(int[] arr){
int m = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i]!= m) return false;
}
return true;
}
}

​​注意:这里是小朋友围坐成一圈,所以是个闭合的环!!!​​



2014省赛糖果分配试题如何解答?