CF-Round #622-div2-B题

CF-Round #622-div2-B题

B. Different Rules

传送门

属实!!这道题理解了丢丢久
贪心题。(这个贪心策略理解了丢丢久)

题目含义也理解了很久=-=emmm一直把排名理解为分数(觉得这样才符合常规)。。但是这样不行
给你主人公在两场比赛中的排名。然后他的总成绩是两次比赛排名的和。问最好的排名和最差的排名是多少
排名规定为比自己总分数小的或相等的人(emm)
这里我就考虑了很久(为啥是比自己分数小的??因为他是把排名加起来为总分数的。。)

我们考虑:最差的排名
最差的排名是有尽可能多的人与主人公的总分数一致。可是使得排名尽可能靠后。主人公的总分数:x+y
我们构造:

1x + y - 1
2x + y - 2
3x + y - 3
x + y - 11

其中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(也就是排名一定在主人公的前面)我们让这部分人的总成绩尽可能小。花费掉那些尽可能多的好排名。

11
22
33
x4
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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

娃娃酱斯密酱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值