天梯 1098 均分纸牌

解题报告:给出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\n",tot);
25     }
26     return 0;
27 }
View Code

 

posted @ 2013-08-09 22:03  xiaxiaosheng  阅读(289)  评论(0)    收藏  举报