原题链接
https://codeforces.com/problemset/problem/1042/A
题目大意
有x个长凳,第 i 个长凳上坐着 a[i] 个,现在有y个人,也要坐在这些长凳上,问这y个人坐下后,设所有长凳上人数的最大值为k,问k的最大值mx和最小值mn分别是多少?
输入
第一行包含一个整数 x (1 <= x <= 100) 表示公园中长椅的数目;
第二行包含一个整数 y (1 <= y <= 1000) 表示有 y 个人来到公园;
接下来 x 个整数 a_i (1<=a_i<=100),表示初始时公园长椅上坐着的人数。
输出
输出 mn 和 mx。
思路
设之前长凳人数的最大值为ma。
mx比较好求,即x+y。
关键是mn,为了使k最小,应该让人们尽量坐在人数较少的长凳上。如果所有人坐下后,长凳人数的最大值仍为ma,那么ma即为mn;如果一部分人坐下后,所有长凳人数都变成了ma,那么为了使mn最小,应该让所有长凳均分剩下的人数。
需要注意的点
- k的最小值并不一定是ma,注意第二种情况。
- 一部分人坐下后,所有长凳人数变成ma,此时长凳数量不一定可以整除剩下的人数,能否整除会影响结果的计算式(差1),需要注意。
完整代码
#include<iostream>
#include<algorithm>
using namespace std;
int x, y, a[2000];
int mx, mn;
int main ()
{
cin>>x>>y;
int ma = -1;
for(int i=0;i<x;i++)
{
cin>>a[i];
if(a[i] > ma) ma = a[i];
}
mx = ma+y;
sort(a, a+x);
for(int i=0;i<x-1;i++) y -= ma - a[i];
if(y <= 0) mn=ma;
else
{
mn=ma+y/x+1;
if(y % x == 0) mn--;
}
cout<<mn<<' '<<mx;
return 0;
}