[codeforces 1313B] Different Rules(逻辑思维推导)

本文解析了一种算法竞赛问题,探讨如何在两轮比赛中获得可能的最高和最低排名。通过构造对手得分,阐述了数学和逻辑思维在算法设计中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

比赛时没有写出来,没有思路。。。。TqT

比赛后看了别人的题解会的(我这个数学菜鸡)https://www.bilibili.com/video/av91242850?p=2

题目链接:https://codeforces.ml/contest/1313/problem/B

题意:一场比赛分两轮,每一轮你都有一个排名(每一轮每个人的排名是不一样的)。最终的排名就是两轮排名相加之后所排在第几个就是第几名。问你可能的最高排名和最低排名是多少?

题解:

最低排名:构造其他人的分数尽可能的和你一样多。

1x+y-1
2x+y-2
......
x+y-11

 

一共可以构造x+y-1个(其中包含了x和y的组合),那么你的最低排名就是min(x+y-1,n)

最高排名:

当x+y<=n时,使别人的分数大于n

1n
2n-1
3n-2
........
n1

那么由此可知,我们可以构造出其他人都大于n的方案,那么此时的名次为1.

当x+y>n时,可知在某一轮中排名在1~(x+y-n)的人,我们无法构造出方案使他们大于x+y.所以我们为了抬高自己的名次应该使低名次的继续低,让某轮排名是1~(x+y-n)的人,我们让他们在另一轮排名也是一样的。每一次去除1~(x+y-n)的人,x,y在剩余人内排名就会提升一个,直到X+Y=N,此时就转换成x+y<=n的情况了。设去除t个人,x-t+y-t=n-t; t=x+y-n;

那么你的最高排名就是min(x+y-n+1,n)

11
22
33
44
......
xy
#include <bits/stdc++.h>
using namespace std;

int main(){
    int t,n,x,y;
    cin>>t;
    while(t--){
        cin>>n>>x>>y;
        int minn,maxnn;
        if(x+y<=n) minn=1;
        else minn=min(x+y-n+1,n);
        maxnn=min(n,x+y-1);
        cout<<minn<<' '<<maxnn<<endl;
    }

    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值