洛谷 p1031

可以先算平均值,然后计算每一个堆和平均值的差距,将这些差距值存在另一个数组里,从小到大遍历这个数组,若不为0则把它的值加到下一个元素里,然后次数加一。这相当于每次将这一个堆的帐记到下一个堆里面,这样就只用一路往数组右边前进,不用考虑某个大于平均值的堆要怎样往左右分配,我不太知道这种思想算什么思想,可能是减治思想,值得借鉴

#include<stdio.h>

int main(void){
    int n;
    scanf("%d", &n);
    int heap[n];
    int give[n];
    int sum=0, avg;
    for(int i=0; i<n; i++)
        give[i] = 0;
    for(int i=0; i<n; i++){
        scanf("%d", &heap[i]);
        sum += heap[i];
    }
    avg = sum/n;
    for(int i=0; i<n; i++){
        give[i] = heap[i] - avg;
    }
    int steps=0;
    for(int i=0; i<n-1; i++){
        if(give[i] != 0){
            give[i+1] += give[i];
            steps++;
        }
    }
    printf("%d", steps);
    return 0;
}

 

转载于:https://www.cnblogs.com/ssNiper/p/11125285.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值