程序设计思维与实践 Week9 作业C - 签到题

题意

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DreamyDreamy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值