HDU-1034 Candy Sharing Game (模拟)

这样简单的题做了半个小时,我学会了一个道理,要认真读题.....(漏读了一个同时交换..)

题意:有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; 
        
    }
}
原文地址:https://www.cnblogs.com/Tianwell/p/11197448.html