题目描述
已知有x条长凳,每条长凳上已经坐着ai个人,现在又来了y个人,这y个人任意选择长凳来坐,坐下后,记k=所有长凳中人数最多的值,求k的max和min可能值。
Input
第一行包含一个整数 x (1 <= x <= 100) 表示公园中长椅的数目
第二行包含一个整数 y (1 <= y <= 1000) 表示有 y 个人来到公园
接下来 x 个整数 a_i (1<=a_i<=100),表示初始时公园长椅上坐着的人数
Output
输出一行, mn 和 mx,以空格隔开
解题思路
max很好求,只需找到初始人数最多的那条长凳,然后y个人全坐在这条长凳即可;
min的求取要遵循“平均”的思想,首先考虑将y个人平均分配,使得所有长凳的人数都等于初始的最大值,如果y不够这样分配,这说明k的min就是初始值中最大的那一个;如果这样分配后,y还有多余的,则再次平均分配,如果刚好除尽,则min=min+y/x,有余数则再加一。
实现代码
#include<iostream>
#include<algorithm>
using namespace std;
int a[110];
int main()
{
int x,y;
cin>>x>>y;
for(int i=1;i<=x;++i)
cin>>a[i];
sort(a+1,a+x+1);
int mx=a[x]+y,mn=a[x];
for(int i=1;i<x;++i)
{
int z=a[x]-a[i];
y-=z;
a[i]=a[x];
if(y<=0)
break;
}
if(y>0)
{
if(y%x==0)
mn+=y/x;
else
mn+=y/x+1;
}
cout<<mn<<" "<<mx<<endl;
return 0;
}
总结
签到题,正确理解k的max和min的可能值的意义,很快就能写出来。