https://www.cnblogs.com/violet-acmer/p/9682082.html
题意:
公园里有n个沙滩,a[i]表示第i个沙滩初始人数,现有m个人可以到任意沙滩,在这m个人全部到达任意沙滩后,求沙滩最多人数的最大值和最小值
例如:
假设有n=5,m=3
a[i] = :1 2 3 4 5
沙滩人数最大化便是这m个人全到第5个沙滩上,a[5]=8,当前所有沙滩的最大值为8
使沙滩人数最大值尽量最小化,第一个人可以来到第一个沙滩,第二个人来到第二个,第三个人来到第三个,此时当前所有沙滩最大值为5
或这3个人全来到第一个沙滩,第一个沙滩的总人数为4,故此时最大值还是5
但若有任意一人来到第五个沙滩,则最大值就变成了6 > 5
题解:
易得最大值最大化便是当前沙滩最大人数+m;
最小化:这m个人优先来到最大值之外的其余沙滩,如果所有沙滩的人数都变成了起初值最大的那个沙滩的人数,则将剩余的人平均分到这n个沙滩上
AC代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 const int maxn=110; 6 7 int n,m; 8 int a[maxn]; 9 10 void Initial() 11 { 12 scanf("%d%d",&n,&m); 13 for(int i=1;i <= n;i++) 14 scanf("%d",&a[i]); 15 } 16 void Process() 17 { 18 sort(a+1,a+n+1); 19 int res=m; 20 for(int i=1;i < n;++i) 21 res -= (a[n]-a[i]); 22 if(res <= 0) 23 printf("%d %d\n",a[n],a[n]+m); 24 else//如果res 有剩余 25 { 26 int k=res/n;//平均每个沙滩有k个人新加入 27 printf("%d %d\n",a[n]+k+(res%n == 0 ? 0:1),a[n]+m); 28 } 29 } 30 int main() 31 { 32 Initial(); 33 Process(); 34 }
原文地址:https://www.cnblogs.com/violet-acmer/p/9682239.html
时间: 2024-10-12 20:23:04