题意:
有x个长凳,每个长凳上有x[i]个人,现在又来了y个人,这y个人随机坐在这些长凳上。这y个人来后,记这些长凳上人数最多的为k个人,求k得最大值和最小值。
输入:
第一行包含一个整数 x (1 <= x <= 100) 表示公园中长椅的数目。
第二行包含一个整数 y (1 <= y <= 1000) 表示有 y 个人来到公园。
接下来 x 个整数 a_i (1<=a_i<=100),表示初始时公园长椅上坐着的人数。
输出:
输出k得最小值和最大值。
思路:
首先最大值很简单,即原先长凳上人数最多加上新来得,即为最大值。
求最小值得时候:人需要依次坐在人数最少得那个长凳,才能使得最大人数最小。可先读取每个长凳上得人数,然后进行排序。数组最后的人数为最大的,此时要考虑两种情况,即来的y个人先坐在前面n-1个长凳上,此时,只要前面长凳上人数个数不超过x[n-1],即最大人数,这时候长凳的最小值就不会发生变化。于是求得前n-1个长凳人数的和,加上y个人,与x[n-1]*(n-1)比较,如果小于等于,即最大值没有发生变化。如果超过了,即将超过部分依次平摊到每个板凳上。即整除可以得到每个长凳上平摊得到的人数。在这个时候在求余,如果余数大于0,则在平摊后的人数上增加1,如果等于0,则刚好每个长凳上分配的人数相等。
代码:
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int X[105];
int x,y;
int main(){
ios::sync_with_stdio(0);
cin>>x>>y;
for(int i=0; i<x;i++){
cin>>X[i];
}
sort(X,X+x);
int sum=0;
for(int i=0; i<x-1;i++){
sum+=X[i];
}
int sum1=X[x-1]*(x-1);
sum+=y;
if(sum<=sum1){
cout<<X[x-1]<<" ";
}else{
sum-=sum1;
int a=sum/x;
int b=sum%x;
if(b==0){
cout<<a+X[x-1]<<" ";
}else{
cout<<a+X[x-1]+1<<" ";
}
}
cout<<X[x-1]+y<<endl;
return 0;
}
174

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



