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