[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 }`