分糖果:
有n个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏:
每个小朋友都把自己的糖果分一半给左手边的孩子。
一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数。
反复进行这个游戏,直到所有小朋友的糖果数都相同为止。
你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果。
输入
程序首先读入一个整数N(2< N< 100),表示小朋友的人数。
接着是一行用空格分开的N个偶数(每个偶数不大于1000,不小于2)
输出
要求程序输出一个整数,表示老师需要补发的糖果数。
样例输入
3
2 2 4
样例输出
4
方法1:
import java.util.Scanner;
public class Main
{
public static boolean check(int[]arr)//判断数组元素是否全相等
{
int f=1;
for(int i=0;i<arr.length-1;i++)
{
if(arr[i]!=arr[i+1]) f=0;
}
if(f==1)
return true;
else return false;
}
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
int cnt=0;
int n=in.nextInt();
int[]arr=new int[n];
int[]f=new int[n];
for(int i=0;i<n;i++)
{
arr[i]=in.nextInt();//读入
f[i]=arr[i]/2;//存入一半
}
while (check(arr)!=true)//不相等继续循环
{
for(int i=0;i<n;i++)
{
if(i==n-1)//等于最后一个
{
arr[i]=arr[i]/2+f[0];
}else
{
arr[i]=arr[i]/2+f[i+1];
}
}
for(int i=0;i<n;i++)
{
if(arr[i]%2==1)//为奇数个数
{
arr[i]+=1;
f[i]=arr[i]/2;
cnt++;
}else
{
f[i]=arr[i]/2;
}
}
}
System.out.println(cnt);
in.close();
}
}
方法2:
import java.util.Scanner;
public class Main
{
public static boolean check(int[]arr)//检查每个元素是否相同
{
int t=arr[0];
for(int i=0;i< arr.length;i++)
{
if(t!=arr[i])
return false;
}
return true;
}
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
int cnt=0;
int n=in.nextInt();
int[]arr=new int[n];
for(int i=0;i<n;i++)
arr[i]=in.nextInt();
while (!check(arr))
{
int t=arr[0];//要先存储数值,因为arr[0]会变化
for(int i=0;i<=n-2;i++)
{
arr[i]-=arr[i]/2;//先减少一半
arr[i]+=arr[i+1]/2;//加上后一个人的一半
if(arr[i]%2!=0)//奇数的话分一个糖果
{
cnt++;
arr[i]++;
}
}
arr[n-1]-=arr[n-1]/2;
arr[n-1]+=t/2;
if(arr[n-1]%2!=0)
{//奇数的话分一个糖果
cnt++;
arr[n-1]++;
}
}
in.close();
System.out.println(cnt);
}
}