#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;
}

  

猜你喜欢

转载自www.cnblogs.com/xiongchongwen/p/11582058.html