• 题目背景

      在双人对决的竞技性比赛。如乒乓球、羽毛球、国际象棋中。最常见的赛制是淘汰赛和循环赛。前者的特点是比赛场数少。每场都紧张刺激,但偶然性较高。后者的特点是较为公平,偶然性较低,但比赛过程往往十分冗长。本题中介绍的瑞士轮赛制,因最早使用于1895年在瑞士举办的国际象棋比赛而得名。

    它能够看作是淘汰赛与循环赛的折衷,既保证了比赛的稳定性,又能使赛程不至于过长。

      

  • 题目描写叙述

      2*N 名编号为 1~2N 的选手共进行R 轮比赛。

    每轮比赛開始前。以及全部比赛结束后,都会依照总分从高到低对选手进行一次排名。

    选手的总分为第一轮開始前的初始分数加上已參加过的全部比赛的得分和。

    总分同样的,约定编号较小的选手排名靠前。

      每轮比赛的对阵安排与该轮比赛開始前的排名有关:第1名和第2名、第3名和第4名、……、第2K–1 名和第2K名、…… 、第2N–1 名和第2N名,各进行一场比赛。

    每场比赛胜者得1分,负者得0分。也就是说除了首轮以外,其他轮比赛的安排均不能事先确定,而是要取决于选手在之前比赛中的表现。

      现给定每一个选手的初始分数及事实上力值,试计算在R轮比赛过后,排名第Q的选手编号是多少。我们如果选手的实力值两两不同。且每场比赛中实力值较高的总能获胜。

      

  • 输入输出格式

    输入格式:

    输入文件名称为swiss.in 。

      输入的第一行是三个正整数N、R、Q。每两个数之间用一个空格隔开,表示有 2*N 名选手、R 轮比赛。以及我们关心的名次 Q。

      第二行是2*N 个非负整数s1,s2,…,s2N,每两个数之间用一个空格隔开,当中 si 表示编号为i 的选手的初始分数。 第三行是2*N 个正整数w1,w2,…,w2N,每两个数之间用一个空格隔开,当中 wi 表示编号为i 的选手的实力值。

    输出格式:

      输出文件名称为swiss.out。

      输出仅仅有一行。包括一个整数,即R 轮比赛结束后,排名第 Q 的选手的编号。

  • 输入输出例子

    输入例子#1:

    2 4 2

    7 6 6 7

    10 5 20 15

    输出例子#1:

    1

    说明

    【例子解释】

  • 【数据范围】

    对于30% 的数据,1 ≤ N ≤ 100;

    对于50% 的数据,1 ≤ N ≤ 10,000 ;

    对于100%的数据,1 ≤ N ≤ 100,000。1 ≤ R ≤ 50,1 ≤ Q ≤ 2N,0≤s1,s2,…,s2N≤108,1≤w1,w2,…,w2N≤108。

    noip2011普及组第3题。

  • 题解

    先说一句。最暴力的做法即每次都快排会T。NOIP的官方数据仅仅会给快排50分。

    事实上仅仅要快排一次就能够了。然后把每一轮的胜利者和失败者分组,能够发现胜利者内部和失败者内部的相对排名是不变的,然后恍然大悟——归并排序。每一轮都模拟出结果,然后分组。直接归并就可以。

  • Code

#include <cstdio>
#include <algorithm>
using namespace std;
struct node
{
int num, val, pw;
node(int num = 0, int val = 0, int pw = 0) :num(num), val(val), pw(pw) {}
bool operator < (const node& b) const
{
if(val > b.val) return true;
if(val < b.val) return false;
return num < b.num;
}
}T[200005], tmp[2][100005];
int n, r, q, s[200005], w[200005];
void init()
{
scanf("%d%d%d", &n, &r, &q);
for(int i = 0; i < (n << 1); ++i) scanf("%d", &s[i]);
for(int i = 0; i < (n << 1); ++i) scanf("%d", &w[i]);
for(int i = 0; i < (n << 1); ++i) T[i] = node(i + 1, s[i], w[i]);
sort(T, T + (n << 1));
}
void work()
{
while(r--)
{
for(int i = 0; i < n; ++i)
{
if(T[i << 1].pw > T[i << 1 | 1].pw)
{
++T[i << 1].val;
tmp[1][i] = T[i << 1];
tmp[0][i] = T[i << 1 | 1];
}
else
{
++T[i << 1 | 1].val;
tmp[1][i] = T[i << 1 | 1];
tmp[0][i] = T[i << 1];
}
}
int top[3] = {0, 0, 0};
while(top[0] < (n << 1))
{
if((top[1] < n) && (tmp[1][top[1]] < tmp[0][top[2]] || top[2] >= n))
{
T[top[0]++] = tmp[1][top[1]];
++top[1];
}
else
{
T[top[0]++] = tmp[0][top[2]];
++top[2];
}
}
}
printf("%d\n", T[q - 1].num);
}
int main()
{
init();
work();
return 0;
}

Noip2011瑞士轮题解的更多相关文章

  1. [NOIP2011]瑞士轮

    noip2011普及组第3题. 题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公平 ...

  2. 【普及】NOIP2011 瑞士轮

    用sort会超时,显而易见. 然后想到了归并.至于为什么把运动员分成输与赢两组,我也不是很清楚,也许换种方式分组也行,但是分成输与赢两组更容易分组与合并. #include<iostream&g ...

  3. 洛谷 P1309 瑞士轮 题解

    每日一题 day4 打卡 Analysis 暴力+快排(其实是归并排序) 一开始天真的以为sort能过,结果光荣TLE,由于每次只更改相邻的元素,于是善于处理随机数的快排就会浪费很多时间.于是就想到归 ...

  4. 洛谷P1309 瑞士轮——题解

    题目传送 思路非常简单,只要开始时把结构体排个序,每次给赢的加分再排序,共r次,最后再输出分数第q大的就行了. (天真的我估错时间复杂度用每次用sort暴力排序结果60分...)实际上这道题估算时间复 ...

  5. 0025:2011年NOIp普及组真题——瑞士轮题解

    题目链接:https://www.luogu.com.cn/problem/P1309 如果是新手可能马上会想到sort排序,每比一次就排一次,但是这样的时间复杂度有点高,只有60分: 这是因为每次比 ...

  6. P1309 瑞士轮 (吸氧了)

    P1309 瑞士轮 题解 1.这题可以模拟一下 2.sort吸氧可以过(可能是排序有点慢吧,不开会T) sort排序时注意: return 1 是满足条件,不交换 return 0是不满足,交换 代码 ...

  7. NOIP2011 普及组 T3 洛谷P1309 瑞士轮

    今天题做太少,放道小题凑数233 题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公 ...

  8. [NOIP2011普及组]瑞士轮 JAVA实现

    题目描述 2*N名编号为1~2N的选手共进行R轮比赛.每轮比赛开始前,以及所有比赛结束后,都会按照总分从高到低对选手进行一次排名.选手的总分为第一轮开始前的初始分数加上已参加过的所有比赛的得分和.总分 ...

  9. NOIP2011普及组 瑞士轮

    OJ地址: https://www.luogu.org/problemnew/show/P1309 http://bailian.openjudge.cn/practice/4031/ 总时间限制:  ...

随机推荐

  1. ReverseEngineerCodeFirst 自定义模板

    1.在你要生成的项目里面在根目录下面添加CodeTemplates文件夹,并在该文件夹下面创建子文件夹ReverseEngineerCodeFirst 2.在ReverseEngineerCodeFi ...

  2. C#接入第三方支付一些小问题

    13年第一次接入支付宝的时候,支付宝的api还不是很好用,费了些劲才完成,本月再次接入的时候发现已经很好用了,接入过程非常顺畅,只出现了一个小问题,我的金额默认是保留了4位小数,支付宝api只接受最多 ...

  3. struts2框架搭建(一)

    struts2是一个基于mvc的web应用框架.struts2本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器层(Controller)来建立模型与视图的数据交互. str ...

  4. java线程中断

    public void Thread.interrupt() // 无返回值 public boolean Thread.isInterrupted() // 有返回值 public static b ...

  5. crypto-js RC4和hash_hmac运用

    遇到一个问题,前端需要加密,可能用到一些算法,推荐这个库:crypto-js, RC4是一个可逆的加密,看下用法: import CryptoJS from 'crypto-js'; const RC ...

  6. Apex语言(四)选择(决策)结构

    1.选择结构 选择结构是当满足某个条件或不满足某个条件时,需要进行决策以控制执行的流程. 2.if语句 if语句由布尔表达式后跟一个或多个语句组成. [格式] if(条件表达式){ 语句: } [流程 ...

  7. EMC VNX5200/5400存储 新增LUN与Hosts映射操作

    EMC VNX5200/5400 1.创建RAID  Groups 1.1        进入EMC VNX5200/5400主界面,依次选择Storage——Storage Pools——RAID ...

  8. 15.3 Task Task.Yield和Task.Delay说明

    https://blog.csdn.net/hurrycxd/article/details/79827958 书上看到一个Task.Yield例子,Task.Yield方法创建一个立即返回的awai ...

  9. CentOS7.4上搭建rocketMQ集群

    一.rocketMQ集群部署方案优缺点对比: 多Master模式(2m-noslave) : 一个集群无Slave,全是Master,例如2个Master或者3个Master 优点:配置简单,单个Ma ...

  10. Vue主要原理最简实现与逻辑梳理

    Vue的主要原理中主要用到了定义的这么几个函数Dep,Watcher,observer.我们来使用这几个函数简单的实现一下vue构造函数数据绑定和相互依赖部分,梳理一下它们之间的关系.省略了编译部分和 ...