题意
SDUQD 旁边的滨海公园有 x 条长凳。第 i 个长凳上坐着 a_i 个人。这时候又有 y 个人将来到公园,他们将选择坐在某些公园中的长凳上,那么当这 y 个人坐下后,记k = 所有椅子上的人数的最大值,那么k可能的最大值mx和最小值mn分别是多少。
Input
第一行包含一个整数 x (1 <= x <= 100) 表示公园中长椅的数目
第二行包含一个整数 y (1 <= y <= 1000) 表示有 y 个人来到公园
接下来 x 个整数 a_i (1<=a_i<=100),表示初始时公园长椅上坐着的人数
Output
输出 mn 和 mx
Example
Input
3
7
1
6
1
Output
6 13
思想
当这 y 个人坐下后
- 记k = 所有椅子上的人数的最大值,k可能的最大值mx一定为现有的凳子上人数的最大值+y
- 记k = 所有椅子上的人数的最大值,k可能的最小值mn的求法如下:
- 要使所有人数的最大值发生改变,则一定有:最大人数分别于每个凳子上的人数做差,再将所有差求和sum
- 若sum>=y,则mn=a;
- 若sum<y,则其最大值的最小值为(所有人数总和+y)/凳子数
代码
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <queue>
using namespace std;
const int INF=1e8+100;
int people[200];
int x,y;
int main()
{
int mn,mx;
int a,b,sum;
scanf("%d",&x);
scanf("%d",&y);
a=0,b=INF,sum=0;
for(int i=1;i<=x;i++)
{
scanf("%d",&people[i]);
a=max(people[i],a);
b=min(people[i],b);
sum+=people[i];
}
int summ=0;
for(int i=1;i<=x;i++)
{
summ+=(a-people[i]);
}
if(summ>=y) mn=a;
else
{
if((sum+y)%x==0) mn=(sum+y)/x;
if((sum+y)%x!=0) mn=(sum+y)/x+1;
}
mx=a+y;
printf("%d %d\n",mn,mx);
return 0;
}