[NOIP2002 提高组] 均分纸牌

【问题描述】

  有 n 堆纸牌,编号分别为 1,2,…,n。每堆上有若干张,但纸牌总数必为 n 的倍数。可以在任一堆上取若于张纸牌,然后移动。

  移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 n 的堆上取的纸牌,只能移到编号为 n-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。

  现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。

【输入格式】

  第 1 行为整数n,表示有n堆纸牌。

  第 2 行有 n 个整数:A1 A2 … An ,Ai 表示第 i 堆纸牌初始数量。

【输出格式】

  所有堆均达到相等时的最少移动次数。

【输入样例】 4 9 8 17 6

【输出样例】 3

【数据范围】 1 <= N <= 100  , l<= Ai <=10000

 

【分析】

跟分油差不多吧……


1
#include<bits/stdc++.h> 2 3 using namespace std; 4 5 int main() { 6 7   a[10000],x,n,sum=0,k=0; 8 9   scanf("%d",&n); 10 11   for(int i=0;i<n;i++) 12 13   { 14 15     scanf("%d",&a[i]); 16 17     sum=sum+a[i]; 18 19   } 20 21   x=sum/n; 22 23   for(int i=0;i<n;i++) 24 25   { 26 27     a[i]=a[i]-x; 28 29   } 30 31   for(int i=0;i<n;i++) 32 33   { 34 35     if(a[i]==0) 36 37     { 38 39       continue; 40 41     } 42 43     a[i+1]=a[i+1]+a[i]; 44 45     k++; 46 47   } 48 49   printf("%d",k); 50 51   return 0; 52 53 }`#include<bits/stdc++.h> 54 55 using namespace std; 56 57 int main() { 58 59   a[10000],x,n,sum=0,k=0; 60 61   scanf("%d",&n); 62 63   for(int i=0;i<n;i++) 64 65   { 66 67     scanf("%d",&a[i]); 68 69     sum=sum+a[i]; 70 71   } 72 73   x=sum/n; 74 75   for(int i=0;i<n;i++) 76 77   { 78 79     a[i]=a[i]-x; 80 81   } 82 83   for(int i=0;i<n;i++) 84 85   { 86 87     if(a[i]==0) 88 89     { 90 91       continue; 92 93     } 94 95     a[i+1]=a[i+1]+a[i]; 96 97     k++; 98 99   } 100 101   printf("%d",k); 102 103   return 0; 104 105 }`

 

posted @ 2021-01-15 10:27  TheZealous  阅读(112)  评论(0编辑  收藏  举报