这样简单的题做了半个小时,我学会了一个道理,要认真读题.....(漏读了一个同时交换..)
题意:有n个小朋友围成一圈坐,每个人手上分别有 a ,b ,c...个糖果。老师每吹一次哨音,小朋友将手上的糖果拿出一半,交给其右边的人(顺时针),如果交换后有小朋友的手上糖果数为奇数,则老师将再给他一颗糖果。求第几次交换后每个人手上糖果数相等,且为多少.
思路:就是按照实际的顺序,写出模拟交换的步骤
#include <iostream> //同时分一半出去 using namespace std; const int maxn = 1e5+9; int arr[maxn]; int half[maxn]; int n; int main(){ while(scanf("%d",&n)&&n){ for(int i=0;i<n;i++){ cin>>arr[i]; } int cnt = 0; while(1){ int k; for(k = 1;k<n;k++){ if(arr[k]!= arr[k-1]) break; } if(k==n) break; //拿出一半的糖果 for(int i=0;i<n;i++){ half[i] = arr[i] /= 2; } //交给右边的人 arr[0] += half[n-1]; for(int i=0;i<n;i++){ if(i==n-1) break; arr[i+1] += half[i]; } //如果有奇数糖果则加1 for(int i=0;i<n;i++){ if(arr[i]&1) arr[i]++; } cnt++; } cout<<cnt<<" "<<arr[0]<<endl; } }