CF-Round #622-div2-B题
B. Different Rules
属实!!这道题理解了丢丢久
贪心题。(这个贪心策略理解了丢丢久)
题目含义也理解了很久=-=emmm一直把排名理解为分数(觉得这样才符合常规)。。但是这样不行
给你主人公在两场比赛中的排名。然后他的总成绩是两次比赛排名的和。问最好的排名和最差的排名是多少
排名规定为比自己总分数小的或相等的人(emm)
这里我就考虑了很久(为啥是比自己分数小的??因为他是把排名加起来为总分数的。。)
我们考虑:最差的排名
最差的排名是有尽可能多的人与主人公的总分数一致。可是使得排名尽可能靠后。主人公的总分数:x+y
我们构造:
1 | x + y - 1 |
---|---|
2 | x + y - 2 |
3 | x + y - 3 |
… | … |
x + y - 1 | 1 |
其中x在1~x + y - 1的范围内
所以主人公最差的排名是:x + y - 1和n的最小值(因为总之n个人。x + y - 1可能大于n)
考虑最好的排名:
两种情况考虑:
1.当x + y <= n 时
最好的排名为1。因为我们可以让其他人的排名都大于n(比如某一个人第一场比赛拿了第一,我们就让他第二场比赛拿第n名)
2.当x + y > n时
这个时候总有一部分人的总分数小于x+y(也就是排名一定在主人公的前面)我们让这部分人的总成绩尽可能小。花费掉那些尽可能多的好排名。
1 | 1 |
---|---|
2 | 2 |
3 | 3 |
x | 4 |
… | … |
… | y |
假设主人公当前排名如上。
总有x+ y - n个人的排名比主人公高。
x + y - n 是怎么来的?
我们设按照下面的匹配策略可以匹配t个人:
此刻x + y > n
我们达到临界情况x + y = n 的时候。(这个时候就跟case1相同了。我们构造的排名就不会有人超过主人公了)
所以:
x - t + y - t = n - t
解得:t = x + y - n;
解释为:我们可以让这些人占据尽可能好的名次
比如:
第一场获得第一名的占据第二场的第一名
第一场获得第二名的占据第二场的第二名
以此类推直到第x + y - n 名
当前有可能x + y - n == n了
所以我们排名取一个最小值:
min(n, x + y - n + 1)
加1的原因是有x + y - n 个人的总分比主人公小。但是没有包括主人公。所以最后需要加1
代码部分直接写在一起了。是max(x + y - n + 1, 1)
如果x + y <= n 那么x + y - n就是一个非负数了。直接取最大值就行。
代码部分:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n, x, y;
int minn, maxx;
int main()
{
int t;
cin >> t;
while (t--)
{
cin >> n >> x >> y;
maxx = min(n, x + y - 1);
minn = min(n, max(1, x + y - n + 1));
cout << minn << " " << maxx << endl;
}
return 0;
}