题目描述:
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
思路:
n个长凳上分别坐了ai个人,再来k个人随便坐,求“最大值的最小”和“最大值的最大”。
对于mx:一定是k个人全部坐在了初始人最多的凳子上。
对于mn:假设有n个长凳,初始值排序后为a1a2.....an,a1为最小值,an为最大值。如果k==0,则mn==an,现在想尽量的使mn小一些,那显然再来的k个人,先在1~n-1上坐,因为1~n-1上的人不满an,现在出现两种情况:k个人全都坐在1~n-1后,a1~an-1仍然小于等于an,此时的mn=an。k个人可以使得a1~an-1都变成an,还剩下k'个人,那么将k’个人平均分配到n个座位上即可。若k'%n==0,则mn=an+(k'/n),若k'%n!=0,则mn=an+(k'/n)+1。
#include<iostream>
#include<algorithm>
using namespace std;
int n,k,a[110];
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+n+1);
int tmp=0;
int mx=a[n]+k,mn;
for(int i=1;i<n;i++)
tmp=tmp+(a[n]-a[i]);
if(tmp>=k)
mn=a[n];
else
{
k-=tmp;
if(k%n==0) mn=a[n]+(k/n);
else mn=a[n]+(k/n)+1;
}
cout<<mn<<" "<<mx;
return 0;
}
探讨了在滨海公园有x条长凳,每条长凳有a_i个人,另有y人到来,如何计算新增人员坐下后长凳上人数最大值的最小与最大可能。通过分析,提出了解决方案并提供了C++实现代码。
613

被折叠的 条评论
为什么被折叠?



