题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1034
题目大意:一圈小孩有初始糖果偶数颗。每次老师吹一次哨,孩子就要把自己糖的一半给右边的小孩。如果结余的糖果是奇数,老师就再给一颗。最后所有小孩糖果是相等的且为定值(因为最大值不会增,最小值不会减,相等的邻居中居右的不变,若最大最小不等,小的势必增加:老师给的)。问需要吹几次口哨,最后小孩都有几颗糖。
关键思想:模拟水题,舍得关系把握好。数据比较弱,水过
代码如下:
//模拟 水题 #include <iostream> using namespace std; int eg[10000]; int main(){ int N; int temp0,temp1,cnt; bool flag=false; while(cin>>N&&N!=0){ flag=false; cnt=0,temp0=0; for(int i=0;i<N;i++)cin>>eg[i]; while(!flag){ temp0=(eg[N-1]/2); //最后一个给第一个的 for(int i=0;i<N;i++){ temp1=eg[i]/2; //temp1是当前要给出去的 if(((eg[i]/=2)+=temp0)%2==1)eg[i]++; //结算后是奇数就拿一个 temp0=temp1; //temp0是当前能拿到的 } cnt++; //判断是否全相等 bool flag0=false; for(int i=1;i<N;i++) if(eg[i]!=eg[i-1])flag0=true; if(flag0==false)flag=true; } cout<<cnt<<" "<<eg[0]<<endl; } return 0; }