HDU1034(水)

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;
}

猜你喜欢

转载自blog.csdn.net/m0_37051465/article/details/81489410