CF1313B Different Rules
B. Different Rules
Problem Restatement
一项奥林匹克竞赛有着与普通竞赛不同的规则,它分成两轮,假如一位参赛者在第一轮中排名第 \(x\) 名,在第二轮中排名第 \(y\) 名,则他的总分是 \(x+y\),他的总排名是总分小于等于 \(x+y\) 的参赛者(包括他自己)。需要注意的是,每一轮比赛都不会出现并列的情况,每一个排名 \(i\) 都对应了唯一的参赛者。
尼古拉被告知他第一轮排名第 \(x\),第二轮排名第 \(y\),他需要你帮助他算出他可能获得的最好总排名和最差总排名
Solution
这种记分好魔鬼啊
你要想排名越前,第一场考的越好,第二场考的越差。但是如果出现第一场考的太好了,第二场最后一名都拯救不过来。那么就让他占两个第一就好。
比如:
1 2 3 4 5 6
1 2 3 4 5 6
你发现第一名怎么都在你前面或和你同分,就让它占两个第一即可。
1 3 2 6 5 4
1 4 6 2 3 5
你会发现,你的分是\(x+y\)。所以如果某场排名小于等于\(x+y-n\)的人都肯定在你前面,所以你的排名就是\(x+y-n+1\)。特判一下你两次都最后名的情况(因为这样就没人能拿第\(n\)名了),或者你考的太好可以拿第一的情况。
你要想排名越往后,你就把尽可能多的人和你同分即可。
比如:
1 2 3 4 5 6 7
1 2 3 4 5 6 7
你只需要让你周围的人尽可能都是\(7\)分
1 2 3 4 5 6 7
6 5 4 3 2 1 7
因为同分排名都靠后啊,这样后面的人也是最少的了。
可以发现,你的排名就是\(\min(y+x-1,n)\)。
Code
#include <bits/stdc++.h>
using namespace std;
void solve(){
int n,x,y;
scanf("%d %d %d", &n, &x, &y);
if(x>y) swap(x,y);
int g,gg;
g=max(1,min(x+y+1-n,n));
gg=min(y+x-1,n);
printf("%d %d\n", g,gg);
}
int main(){
int T;
scanf("%d", &T);
while(T--){
solve();
}
return 0;
}
本人博客
leachim.wang
本人Github主页
https://github.com/Michaelwmx/
上面有我平时写的代码和模板。
欢迎同好一起交流学习~