神 MY 参加了 IOI,赛后他想了解关于自己排名的信息。
题目描述
MY 共参加了 TT 次 IOI,每次有 nn 场考试,mm 个人参加。他不知道自己的总分数,但知道每场考试的名次。
MY 迫切地想知道自己成绩的范围,于是他找到了你。
现在告诉你 MY 每次的排名,请你计算出他最好和最差的可能名次。
让我们假设IOI分数没有上限
不必考虑并列情况
输入格式
第一行1个正整数 TT,表示 MY 参加 IOI 的次数。
接下来 T\times2T×2 行,表示 TT 次IOI的信息。
每组数据中:
第 11 行2个正整数 nn,mm,表示第 ii 次 IOI 的考试场数与参加人数;
第 22 行 nn 个正整数 rank_1rank
1
,…,rank_nrank
n
,表示第 ii 次 IOI 中 nn 场考试 MY 的名次。
输出格式
TT 行,第 ii 行2个正整数 ll,rr,表示 MY 第 ii 次 IOI 的最好排名与最差排名。
》》
4
5 5
1 1 1 1 1
2 3
1 2
1 3
2
5 5
1 2 2 2 3
《《
1 1
1 2
2 2
1 5
https://www.luogu.com.cn/problem/T119274?contestId=28471
对于最好排名,显然,只要有一次排名比别人好,就可以算作总排名比他好。(最理想的状态,反正分数没定,可以假设分数特别高)并且,尽量每次超过不同的人,这样排名当然最好。
如此,得到总共超过的人数(当然,要保证在排名范围内)便可以算出最好排名。
对于最差排名,就恰好相反,只要一次被别人甩,就假设总排名也不如别人了。思路与操作皆类似。
至于代码相信都会写吧。
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<queue>
#include<map>
#include<bitset>
using namespace std;
#define re register int
int t,n,m,a,b,x;
signed main(){
cin>>t;
while(t--){
cin>>n>>m;a=b=0;
for(re i=1;i<=n;i++){
cin>>x;a+=x-1;b+=m-x;
}
a=min(a,m-1);b=min(b,m-1);
cout<<m-b<<" "<<a+1<<endl;
}
return 0;
}