题目大意:
n组学生,开始第i组有ai个人,要使每组人数在[r,l]上,问最少移动多少个学生?(若不存在输出-1)(很迷的数据范围n<=50)
思路:
//洛谷上说这是普及-,但我想了好久。
先判是否存在。
若存在:
- 计算所有超出的组总共至少超了多少(记为a);
- 计算不够的组总共至少要补多少(c);
- 用超出的补不够的是否够用,若不够用还要多少(x);
可能有点乱,其实就是ans=max(a,c);
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 #include<cstdio> 2 #include<algorithm> 3 4 using namespace std; 5 6 int n,ans,big,sum,l,cnt,r; 7 int cn,small; 8 int per[100]; 9 10 int main() 11 { 12 scanf("%d",&n); 13 for(int i=1;i<=n;i++) 14 { 15 int tem; 16 scanf("%d",&tem); 17 sum+=tem; 18 per[i]=tem; 19 } 20 scanf("%d%d",&l,&r); 21 for(int i=1;i<=n;i++) 22 { 23 if(per[i]>r) 24 { 25 big+=per[i]; 26 cnt++; 27 } 28 if(per[i]<l) 29 { 30 small+=per[i]; 31 cn++; 32 } 33 } 34 double geshu=sum; 35 geshu/=n; 36 if((geshu<l)||(geshu>r)) 37 { 38 printf("-1\n"); 39 return 0; 40 } 41 ans=max(big-r*cnt,l*cn-small); 42 printf("%d\n",ans); 43 return 0; 44 }