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;
}
posted @ 2020-03-01 11:12  Leachim  阅读(195)  评论(0编辑  收藏  举报