Codeforces Round #622 (Div. 2) B. Different Rules
题意:
你在参加一个比赛,最终按两场分赛的排名之和排名,每场分赛中不存在名次并列,给出参赛人数 n 和你两场分赛的排名 x, y,问你最终名次最小和最大可能是多少。
思路:
以8人为例:
x + y = 2,最小第一名,最大第一名:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |||||||
8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
x + y = 3,最小第一名,最大第二名。
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ||||||
8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
x + y = n + 1,最小第二名,最大第 n 名。
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
x + y = n + 2,最小第三名,最大第 n 名。
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
没错,相信聪明的你已经发现规律了:
- 当 2 ≤ x + y ≤ n 时,最小值总为第一名,最大值取决于 x + y 比 2 大多少,每大 1 就会对齐一对和为 x + y 的数,即最大名次 + 1。
- 当 n + 1 ≤ x + y ≤ 2n 时,最大值总为第 n 名,最小值取决于 x + y 比 n + 1 大多少,每大 1 就会错出一对和小于 x + y 的数,即最小名次 + 1。
#include <bits/stdc++.h>
using namespace std;
void solve(){
int n,x,y;cin>>n>>x>>y;
if(x+y<=n) cout<<1<<' '<<x+y-1<<endl;
else cout<<min(n,x+y-n+1)<<' '<<n<<endl;
}
int main()
{
int t;cin>>t;
while(t--)
solve();
return 0;
}