キャンディーを分割する
リソース制限
制限時間:1.0秒メモリ制限:256.0MB
問題の説明
輪になって座っている子供はn人います。先生は各子供にランダムに偶数のキャンディーを与え、次に次のゲームをしました:
各子供は彼の左側の子供に彼のキャンディーを半分に分けました。
砂糖を割った後、キャンディーの数が奇数の子供には、先生から偶数が与えられます。
すべての子供が同じ数のキャンディーを持つまで、このゲームを繰り返します。
あなたの仕事は、教師が既知の最初のキャンディーの下で再発行する必要があるキャンディーの数を予測することです。入力フォーマット
プログラムは最初に、子の数を表す整数N(2 <N <100)を読み取ります。
スペースで区切られたN個の偶数の行が続きます(各偶数は1000以下、2以上)出力フォーマット
プログラムは、教師が再発行する必要のあるキャンディーの数を示す整数を出力する必要があります。
サンプル入力
3
2 2 4サンプル出力
4
アイデアは非常に明確です。理解できない場合は、コード分析に従ってください(* ^▽^ *)
実装コード:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
int a[105];
int i,j;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
//完成输入
int t;
int f;
int sum=0;//记录给出了多少糖果
while(1)
{
f=0;
t=a[1];
for(i=2;i<=n;i++)//结束的条件
{
if(a[i]!=t)
{
f=1;
break;
}
}
if(f==0)
{
printf("%d",sum);
return 0;
}
int kk;
kk=a[1];//记录一下a【1】原本的值是多少
for(i=2;i<=n;i++)
{
a[i-1]+=a[i]/2;
a[i]=a[i]/2;
}
a[n]+=kk/2;
a[1]-=kk/2;
//for(i=1;i<=n;i++)
//printf("%d ",a[i]);
//分完糖果老师来了
for(i=1;i<=n;i++)
{
if(a[i]%2!=0)//如果是奇数
{
a[i]++;
sum++;
}
}
}
return 0;
}