• 题目背景

      在双人对决的竞技性比赛。如乒乓球、羽毛球、国际象棋中。最常见的赛制是淘汰赛和循环赛。前者的特点是比赛场数少。每场都紧张刺激,但偶然性较高。后者的特点是较为公平,偶然性较低,但比赛过程往往十分冗长。本题中介绍的瑞士轮赛制,因最早使用于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. sql学习--insert

    insert的四种插入方式 第一种最简单的 into 和目标列的列表是可选的 intsert [into] tableA [(col1,col2)] values(val1,val2) 第二种 ins ...

  2. Flutter GitLab 客户端

    F4Lab Flutter for GitLab. 欢迎参加一起完成

  3. Verification之PSL之use

    1 Where can PSL be used? • Documentation – Requirements – RTL Designs • Controllers – Memories, FIFO ...

  4. Eclipse之注释部分代码

    有时为了调试,部分代码需要注释掉,如果一行一行的加注释符特别麻烦. 一.快捷键:ctrl+/ 选择需要注释的部分,点Ctrl+/,这段代码前,自动加注释语. 取消注释也是按Ctrl+/ 步骤: 选择需 ...

  5. 【sqli-labs】 less28a GET- Blind based -All you Union&Select Belong to us -String -Single quote-parenthesis(GET型基于盲注的去除了Union和Select的单引号带括号字符型注入)

    和less28没什么区别,直接上个payload吧 http://192.168.136.128/sqli-labs-master/Less-28a/?id=0')%a0uNion%a0sElect% ...

  6. Js 字符串中提取数字

    一 parseInt()方法: 首先想到的是js提供的parseInt方法,例子: var str ="4500元"; var num = parseInt(str); alert ...

  7. javaee Properties键值对写入和读取方法

    package Zjshuchu; import java.util.Properties; import java.util.Set; public class Demo03 { public st ...

  8. BZOJ 1645: [Usaco2007 Open]City Horizon 城市地平线 扫描线 + 线段树 + 离散化

    Code: #include<cstdio> #include<algorithm> #include<string> #define maxn 1030000 # ...

  9. 【转载】push to origin/master was rejected错误解决方案

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/a137151062/article/details/78820806idea中,发布项目到OSChi ...

  10. Android 性能测试初探(四)

    书接上文 Android 性能测试初探(三) 自从 cpu及内存后,GPU 这个词对于 PC 性能测试者也不陌生了,什么 3Dmax,安兔兔之类的第三方软件让 GPU 在移动端性能测试领域都知晓,但对 ...