Codeforces Round #622 (Div. 2) B. Different Rules(数学)

时间:2024-01-06 12:03:14

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;
}