解题报告:给出n堆纸牌,现在规定:第一堆的牌只能移动到第二堆,然后第n堆的牌只能移动到第n-1堆,然后其他的堆里的牌可以往两边移动,一次可以移动任意张,问最少可以经过多少次移动才可以使得所有堆里面的牌的数量相同(可以确定的是牌的总数是堆的数的整数倍)
这题可以说是贪心,我的做法是定义一个数,初始化为0,同时定义一个位置指针,然后从第一个位置往后移动,每次都加上这个堆的纸牌数与平均数的差,当这个数等于0的时候就将这个位置与位置指针的差累加起来,同时将位置指针更新到当前位置的下一个位置。这样最后便得到最后结果,时间复杂度只是O(n)。下面是代码:
1 #include<cstdio> 2 const int maxn = 100+3; 3 int n,A[maxn]; 4 5 int main() { 6 int sum = 0 , eve ; 7 while(scanf( " %d " , & n ) != EOF) { 8 sum = 0; 9 for( int i = 1;i <= n ; ++i ) { 10 scanf("%d",&A[i]); 11 sum += A[i]; 12 } 13 14 eve = sum / n; 15 int t = 0 , flag = 1 , tot = 0 ; 16 17 for( int i = 1;i <= n ; ++i ) { 18 t += ( A[i] - eve ) ; 19 if( t == 0 ) { 20 tot += (i - flag); 21 flag = i + 1 ; 22 } 23 } 24 printf("%d ",tot); 25 } 26 return 0; 27 }