zoukankan      html  css  js  c++  java
  • CF1313B Different Rules

    B. Different Rules

    原题传送门

    Problem Restatement

    一项奥林匹克竞赛有着与普通竞赛不同的规则,它分成两轮,假如一位参赛者在第一轮中排名第 (x) 名,在第二轮中排名第 (y) 名,则他的总分是 (x+y),他的总排名是总分小于等于 (x+y) 的参赛者(包括他自己)。需要注意的是,每一轮比赛都不会出现并列的情况,每一个排名 (i) 都对应了唯一的参赛者。

    尼古拉被告知他第一轮排名第 (x),第二轮排名第 (y),他需要你帮助他算出他可能获得的最好总排名和最差总排名

    Solution

    这种记分好魔鬼啊

    你要想排名越前,第一场考的越好,第二场考的越差。但是如果出现第一场考的太好了,第二场最后一名都拯救不过来。那么就让他占两个第一就好。

    比如:

    1 2 3 4 5 6

    1 2 3 4 5 6

    你发现第一名怎么都在你前面或和你同分,就让它占两个第一即可。

    1 3 2 6 5 4

    1 4 6 2 3 5

    你会发现,你的分是(x+y)。所以如果某场排名小于等于(x+y-n)的人都肯定在你前面,所以你的排名就是(x+y-n+1)。特判一下你两次都最后名的情况(因为这样就没人能拿第(n)名了),或者你考的太好可以拿第一的情况。

    你要想排名越往后,你就把尽可能多的人和你同分即可。

    比如:

    1 2 3 4 5 6 7

    1 2 3 4 5 6 7

    你只需要让你周围的人尽可能都是(7)

    1 2 3 4 5 6 7

    6 5 4 3 2 1 7

    因为同分排名都靠后啊,这样后面的人也是最少的了。

    可以发现,你的排名就是(min(y+x-1,n))

    Code

    #include <bits/stdc++.h>
    using namespace std;
    
    void solve(){
    	int n,x,y;
    	scanf("%d %d %d", &n, &x, &y);
    	if(x>y) swap(x,y);
    	int g,gg;
    	g=max(1,min(x+y+1-n,n));
    	gg=min(y+x-1,n);
    	printf("%d %d
    ", g,gg);
    }
    
    int main(){
    	int T;
    	scanf("%d", &T);
    	while(T--){
    		solve();
    	}
    	return 0;
    }
    
  • 相关阅读:
    nohup 忽略 nohup.out 输出
    elementui 发送时间格式到 gin 后端问题
    在 Ubuntu 下使用 Puppeteer 时无法加载类库 libX11-xcb.so.1
    获取注解上的注解
    tomcat 远程 debug
    使用pytorch-lightning漂亮地进行深度学习研究(转)
    CTR预估模型发展历程(转)
    pytorch重要函数介绍
    Dataset和Dataloader
    推荐系统中的ID特征为什么有用?
  • 原文地址:https://www.cnblogs.com/leachim/p/12388715.html
Copyright © 2011-2022 走看看