洛谷 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