P1031 [NOIP2002 提高组] 均分纸牌

问题描述:

 

思路:

首先给出所有的数,我们可以计算出每个堆最后的平均值,由于移动方向最多只有左右,所以每个堆只能改变旁边的值,为了方便我们从左到右遍历,不断得通过下一数来调整当前数,使当前数等于平均值,所以每个数最多只需要调整一次数便可,所以是最优解。

Code: 

#include<bits/stdc++.h>
using namespace std;

int m;
int a[110];


int main(){
	cin >> m;
	while(m -- ){
		
		int n;
	    cin >> n;
	    
	    int num = 0;
	    for(int i = 1;i <= n;i ++ ) cin >> a[i],num += a[i]; //计算总数 
	    
	    int t = num / n;                                            //平均值 
	    
	    int ans = 0;
	    for(int i = 1;i <= n;i ++ ){
	            if(a[i] < t){                //低于平均值 从下一个数补满 
	                a[i + 1] -= t - a[i];
	                ans ++ ;
	            }
				else if(a[i] > t){        //高于平均值,多出的给下一个值 
	                a[i + 1] += a[i] - t;
	                ans ++ ;
	            }    
	    }
	    
	    cout << ans; 
	    
	    puts("");
	}
	
    return 0;
}

代码运行截图:

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

那就随便一点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值