题目描述
9102年,wwh第二次参见NOIP,那一年,赛制发生了改变,已经不像现在的分数了,从原来的100分制变成了一分制,即用一个[0,1]的实数来表示。同时在赛制的影响下,保证两个人的分数一定不相同。
wwh在考场上电脑死机了,考完后,就在他万念俱灰的时候,他想起来一个事情:今年总共有n道题,有m个人来考试,现在他知道了每题他自己在m个人中的排名,为了估测自己可不可以拿到省一等奖,他想知道自己n题的总分的排名最小可能值与最大可能值。
输入描述
第一行两个正整数n,m,含义见题目表述。
接下来n行每行一个[1,m]间的正整数表示wwh每一题的得分的排名。
输出描述
一行一个正整数,共两行,分别表示wwh总分排名的最小值和最大值。
样例输入1
3 3
3
3
3
样例输出1
3
3
样例输入2
6 6
1
2
3
1
2
1
样例输出2
1
5
样例2提示
仔细观察wwh有3道题目是排在第一名的位置,利用枚举的思想,将总分抽象成为排名之和,暴力后可得无论如何安排人次,均不可能使得wwh排在第六名,只可以排在第五名。
同理,经过适当的名次安排后完全可以使得wwh排在第一。
最后的思考:在什么情况下,A的总成绩可以排在B前面?
答案:A只要有一门课比B高,A完全就有可能总成绩比B的成绩高。
继续思考样例2:
我们讨论一下排名最大值的情况。第一题没有人在wwh前面,第二题有一个人在前面,第三题有两个人,第四题没有人,第五题有一个人在前面,总共可以有4个人在wwh前面,所以wwh最坏排第5名
数据规模与约定
时间限制:1s
对于30%的数据,n<=2
另有20%的数据,m<=2
对于100%的数据,1<=n<=1000,1<=m<=10^4
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
int n,m,a,b,c;
int read(){
int a=0,b=1;
char ch=getchar();
while((ch<48||ch>57)&&ch!='-'){
ch=getchar();
}
if(ch=='-'){
b=-1;
ch=getchar();
}
while(ch<48||ch>57){
ch=getchar();
}
while(ch>47&&ch<58){
a=a*10+ch-48;
ch=getchar();
}
return a*b;
}
int main(){
n=read(),m=read();
a=m,c=0,b=1;
int x;
for(int i=1;i<=n;i++){
x=read();
a=min(a,x);
b+=(x-1);
c+=(m-x);
}
b=min(b,m);
c-=(m-a);
a=max(1,a-c);
printf("%d\n%d",a,b);
return 0;
}