HDU1034
题目简介:
一些学生围着老师坐成一圈,每个人手里有一些糖。
老师一吹哨子,学生就将糖分给右手边同学,分一半。
如果一个学生手里的糖为奇数,则老师给他一个额外的糖,凑成偶数。
问老师要吹多少次哨子能使得每个学生手里的糖数量相同。
输出吹哨次数与糖的数量。
题目链接
代码及思路如下:
/*author:Mason.Z
source:HDU1034
point:让先给下一个同学才能拿上一个同学.*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<math.h>
#include<algorithm>
#include<map>
#define MAXN 1000000
using namespace std;
int arr[100001][2];
/*
*arr[100001][0]表示当前状态下拥有的糖数
*arr[100001][1]表示从这个人手中拿走的糖数
*/
int n;
bool check()
{
int i;
for(i=0;i<n-1;i++)
{
if(arr[i][0]!=arr[i+1][0])
return false;
}
return true;
}
int main()
{
int i;
int time;
while(scanf("%d",&n)==1&&n){
for(i=0;i<n;i++){
scanf("%d",&arr[i][0]);
}
time=0;
while(check()==false)
{
for(i=0;i<n;i++)
{
arr[i][1]=arr[i][0]/2;
arr[i][0]=arr[i][1];//把糖拿走,并未开始放糖
}//糖拿完了,准备放糖。
//放糖
for(i=1;i<n;i++)
{
arr[i][0]=arr[i][0]+arr[i-1][1];//放糖
if((arr[i][0]&1)==1){
arr[i][0]=arr[i][0]+1;//放糖之后,检测奇偶
}
}
arr[0][0]=arr[0][0]+arr[n-1][1];
if((arr[0][0]&1)==1){
arr[0][0]=arr[0][0]+1;
}
//对于末尾单独放
++time;
}
printf("%d %d\n",time,arr[0][0]);
}
return 0;
}