#532. 排名
题目描述
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; }