您的位置:首页 > 理论基础 > 计算机网络

http://acm.hdu.edu.cn/showproblem.php?pid=1034

2013-05-28 17:07 351 查看
题目意思:有输入N在第一行,然后接下来的有N行,分别是N个人的糖果数,而且老师一吹口哨,每个人都给自己右边的人二分之一自己的糖果数,如果分后糖果数量为奇数,则老师在给他一颗糖,直到每人的糖果数相等为止,问:这样老师要吹多少次口哨,并且此时糖果数为多少?

思路:首先由题可知:a[1]=a[1]/2+a
/2;则a[i]=a[i]/2+a[i-1]/2;这样循环,(直到i==n)为止。

一下为AC代码:注意循环时啊a[i]不可直接与前后数字相除,而是要转化下,为吧a[i]=b[i]/2;这样不易出错,当你没把啊a[i].转化时,可能会出错,我当时就出错了,结果就是对不到答案!因此,,,

#include<iostream>

#include<cmath>

#include<cstdio>

using namespace std;

int a[1001],b[1001];

int main()

{

    int i,t,n;

    while(scanf("%d",&n)!=EOF)

    {

        if(n==0)

            break;

        for(i=0;i<n;i++)

        {

            scanf("%d",&a[i]);

        }

        int flag=1;int k=0;

     while(1)

        {

            k++;

            for(i=0;i<n;i++)//注意一下步骤!

            {

               b[i]=a[i]/2;//此处要注意!

            }

            for(i=1;i<n;i++)

            {

                a[i]=b[i]+b[i-1];

                if(a[i]%2!=0)

                    a[i]++;

            }

            a[0]=b[0]+b[n-1];//不要漏掉第一个人,和最后一个人。

            if(a[0]%2!=0)

                a[0]++;//接下来寻找出是否全相等!

            int t=a[0];

            for(i=1;i<n;i++)//注意应该从第二个人开始!

                if(t!=a[i])

            {

                flag=0;break;

            }

            if(flag)

            {

                printf("%d %d\n",k,t);

                break;

            }

            else

                flag=1;

            }

        }

        return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: