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
Sample Input
3
7
1
6
1
Sample Output
6 13
题解
先一次循环,计算出公园中人数最多的椅子上的人数tmx;再一次循环,计算将所有椅子上的人数都加到tmx一共需要多少人(n)。
最大值mx就是如果来的y个人都坐在了当前人数最多的椅子上(mx=tmx+y)。最小值时,如果y<n,则说明来的人坐在其他人数较少的椅子上不改变最大值tmx的椅子就能全部坐下,则最小值为tmx;如果y>n,假设有n个人坐在了人数较少的椅子上将所有椅子的人数都变成了tmx,还剩下y-n个人,让他们均匀的坐在所有椅子上(每个椅子上人数尽可能少),计算最小值。
代码
#include <iostream>
#include <stdio.h>
using namespace std;
int a[110];
int main(int argc, char** argv) {
int x,y;scanf("%d%d",&x,&y);
for(int i=1;i<=x;i++){
scanf("%d",&a[i]);
}
int tmx=0;//人数最多的长凳上的人
for(int i=1;i<=x;i++){
if(a[i]>tmx){
tmx=a[i];
}
}
int n=0;//来n个人可以将所有长凳上的人都加到tmx
for(int i=1;i<=x;i++){
n=n+(tmx-a[i]);
}
int mx,mn;
mx=tmx+y;//所有刚来的都坐到人数最多的凳子上
if(y<=n){
mn=tmx;
} else{
y=y-n;
if(y%x==0){mn=tmx+y/x;
}else{mn=tmx+y/x+1;}
}
printf("%d %d",mn,mx);
return 0;
}