C 长凳

题意:

有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;
} 
	
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值