均分纸牌

来源:互联网 发布:阿里云控制面板 编辑:程序博客网 时间:2024/04/27 19:43

均分纸牌

Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 20   Accepted Submission(s) : 9

Font: Times New Roman | Verdana | Georgia

Font Size:  

Problem Description

有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若干张纸牌,然后移动。
移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。
现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。
例如 N=4,4 堆纸牌数分别为: ① 9 ② 8 ③ 17 ④ 6
移动3次可达到目的:
从 ③ 取4张牌放到④(9 8 13 10)->从③取3张牌放到 ②(9 11 10 10)-> 从②取1张牌放到①(10 10 10 10)。

Input

Output

对于每组数据,所有堆均达到相等时的最少移动次数。

Sample Input

49 8 17 60

Sample Output

3

//思路:求出平均数  再求出每个数据和平均数直接的差值 再一遍循环向左就行了例如:
 1  2 3 4 5
-2 -1 0 1 2
次数为4
#include <iostream>#include <string.h>#include <stdio.h>using namespace std;int a[105],b[105];int main (){    int t;    while(scanf("%d",&t)&&t)    {  int sum=0,average=0,ans=0;        memset(a,0,sizeof(a));       memset(b,0,sizeof(b));        for(int i=0; i<t; i++)        {            scanf("%d",&a[i]);            sum+=a[i];        }        average=sum/t;        for(int i=0;i<t;i++)           {               b[i]=a[i]-average;           }        for(int i=0;i<t;i++)        { b[i]=b[i-1]+b[i];            if(b[i]!=0)                ans++;                else                    continue;        }        printf("%d\n",ans);    }    return 0;}