比赛时没有写出来,没有思路。。。。TqT
比赛后看了别人的题解会的(我这个数学菜鸡)https://www.bilibili.com/video/av91242850?p=2
题目链接:https://codeforces.ml/contest/1313/problem/B
题意:一场比赛分两轮,每一轮你都有一个排名(每一轮每个人的排名是不一样的)。最终的排名就是两轮排名相加之后所排在第几个就是第几名。问你可能的最高排名和最低排名是多少?
题解:
最低排名:构造其他人的分数尽可能的和你一样多。
1 | x+y-1 |
2 | x+y-2 |
... | ... |
x+y-1 | 1 |
一共可以构造x+y-1个(其中包含了x和y的组合),那么你的最低排名就是min(x+y-1,n)
最高排名:
当x+y<=n时,使别人的分数大于n
1 | n |
2 | n-1 |
3 | n-2 |
.... | .... |
n | 1 |
那么由此可知,我们可以构造出其他人都大于n的方案,那么此时的名次为1.
当x+y>n时,可知在某一轮中排名在1~(x+y-n)的人,我们无法构造出方案使他们大于x+y.所以我们为了抬高自己的名次应该使低名次的继续低,让某轮排名是1~(x+y-n)的人,我们让他们在另一轮排名也是一样的。每一次去除1~(x+y-n)的人,x,y在剩余人内排名就会提升一个,直到X+Y=N,此时就转换成x+y<=n的情况了。设去除t个人,x-t+y-t=n-t; t=x+y-n;
那么你的最高排名就是min(x+y-n+1,n)
1 | 1 |
2 | 2 |
3 | 3 |
4 | 4 |
... | ... |
x | y |
#include <bits/stdc++.h>
using namespace std;
int main(){
int t,n,x,y;
cin>>t;
while(t--){
cin>>n>>x>>y;
int minn,maxnn;
if(x+y<=n) minn=1;
else minn=min(x+y-n+1,n);
maxnn=min(n,x+y-1);
cout<<minn<<' '<<maxnn<<endl;
}
return 0;
}