Time Limit : 1 Second Memory Limit : 65536 KB
Source : 第十届山东省ACM省赛
Problem Link : ZOJ 4118
Author : Houge Date : 2019-5-20
题目大意:
有n堆石头,每一次都可以进行一下操作之一:
·从一个非空石堆里拿走一块石头。
·把一块石头从一个石堆(非空)移动到另一个里。
问最少进行多少次操作可使每个石堆石头的数量相同。
分析:
简单的思维题。先求一个平均数(向下取整),这个数就是最后每个石堆的石头数,然后求一下数量比平均数多的堆一共比平均数多了几个石头,就是所求的答案。
代码:
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 int main() 6 { 7 int t; 8 scanf("%d",&t); 9 while(t--) 10 { 11 long long n,num[100005],avg=0,i,cnt=0; // cnt 会爆 int 12 scanf("%lld",&n); 13 for(i=0;i<n;i++) 14 { 15 scanf("%lld",&num[i]); 16 avg+=num[i]; 17 } 18 avg/=n; 19 for(i=0;i<n;i++) 20 if(avg<num[i]) cnt+=num[i]-avg; 21 printf("%lld ",cnt); 22 } 23 return 0; 24 }