[NOIP2011 普及组] 瑞士轮

题目背景

在双人对决的竞技性比赛,如乒乓球、羽毛球、国际象棋中,最常见的赛制是淘汰赛和循环赛。前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高。后者的特点是较为公平,偶然性较低,但比赛过程往往十分冗长。

本题中介绍的瑞士轮赛制,因最早使用于 1895 1895 1895年在瑞士举办的国际象棋比赛而得名。它可以看作是淘汰赛与循环赛的折中,既保证了比赛的稳定性,又能使赛程不至于过长。

题目描述

2 × N 2 \times N 2×N 名编号为 1 ∼ 2 N 1\sim 2N 1∼2N 的选手共进行R 轮比赛。每轮比赛开始前,以及所有比赛结束后,都会按照总分从高到低对选手进行一次排名。选手的总分为第一轮开始前的初始分数加上已参加过的所有比赛的得分和。总分相同的,约定编号较小的选手排名靠前。

每轮比赛的对阵安排与该轮比赛开始前的排名有关:第 1 1 1 名和第 2 2 2 名、第 3 3 3 名和第 4 4 4名、……、第$2K - 1 名和第 名和第 名和第 2K$名、…… 、第$2N - 1 $名和第 2 N 2N 2N名,各进行一场比赛。每场比赛胜者得$1 $分,负者得 $0 $分。也就是说除了首轮以外,其它轮比赛的安排均不能事先确定,而是要取决于选手在之前比赛中的表现。

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

输入格式

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

第二行是 2 × N 2 \times N 2×N 个非负整数 s 1 , s 2 , … , s 2 N s_1, s_2, …, s_{2N} s1​,s2​,…,s2N​,每两个数之间用一个空格隔开,其中$ s_i 表示编号为 表示编号为 表示编号为i$ 的选手的初始分数。 第三行是 2 × N 2 \times N 2×N 个正整数 w 1 , w 2 , … , w 2 N w_1 , w_2 , …, w_{2N} w1​,w2​,…,w2N​,每两个数之间用一个空格隔开,其中 w i w_i wi​ 表示编号为 i i i 的选手的实力值。

输出格式

一个整数,即 R R R 轮比赛结束后,排名第$ Q$ 的选手的编号。

样例 #1

样例输入 #1

2 4 2
7 6 6 7
10 5 20 15

样例输出 #1

1
#include <bits/stdc++.h>
using namespace std;//做法一:调用merge函数
#define de(x) cout<<x<<" ";
#define Pu puts("");
#define sf(x) scanf("%d",&x);
typedef long long ll;
const int N=2e5+10,mod=100003;
struct E{int id,u,w;bool operator <(const E& t){//结构体内部排序使用小于号if(u==t.u) return id<t.id;return u>t.u;}
}s[N],win[N],lose[N];
int n,m,ans;
int r,q;
int main(){cin>>n>>r>>q;n*=2;for(int i=1;i<=n;i++){sf(s[i].u)s[i].id=i;}for(int i=1;i<=n;i++){sf(s[i].w)}sort(s+1,s+n+1);//第一轮之前进行排序while(r--){for(int i=2;i<=n;i+=2){if(s[i].w>s[i-1].w){s[i].u++;win[i/2]=s[i];//获胜者lose[i/2]=s[i-1];//失败者}else{s[i-1].u++;win[i/2]=s[i-1];lose[i/2]=s[i];}}//Merge();//首先想到是快排,但是每次有nlog(n)的时间复杂度//分为胜者组和败者组,每次比赛后,两个数组里元素的相对大小是不变的,可以log(n)的时间复杂度达到同样的效果//sort(s+1,s+n+1,cmp);//做法一:调用函数merge(lose+1,lose+n/2+1,win+1,win+n/2+1,s+1);}de(s[q].id)return 0;
}
#include <bits/stdc++.h>
using namespace std;//做法一:手写归并
#define de(x) cout<<x<<" ";
#define Pu puts("");
#define sf(x) scanf("%d",&x);
typedef long long ll;
const int N=2e5+10,mod=100003;
int a[N],win[N],lose[N];//id数组代表排外序之后的下标
//win和lose数组代表获胜者和失败者的下标,用于归并排序
int u[N],w[N];
int n,m,ans;
int r,q;
bool cmp(int x,int y){if(u[x]==u[y]) return x<y;//返回下标比较小的元素return u[x]>u[y];
}
void Merge(){int l=1,r=1;int cn=0;while(l<=n/2&&r<=n/2){if(cmp(win[l],lose[r])){a[++cn]=win[l];l++;}else{a[++cn]=lose[r];r++;}}while(l<=n/2) a[++cn]=win[l],l++;while(r<=n/2) a[++cn]=lose[r],r++;
}
int main(){cin>>n>>r>>q;n*=2;for(int i=1;i<=n;i++){sf(u[i])a[i]=i;}for(int i=1;i<=n;i++){sf(w[i])}sort(a+1,a+n+1,cmp);//第一轮之前进行排序while(r--){for(int i=2;i<=n;i+=2){if(w[a[i]]>w[a[i-1]]){u[a[i]]++;win[i/2]=a[i];//获胜者lose[i/2]=a[i-1];//失败者}else{u[a[i-1]]++;win[i/2]=a[i-1];lose[i/2]=a[i];}}Merge();//做法二:不调用函数// //首先想到是快排,但是每次有nlog(n)的时间复杂度// //分为胜者组和败者组,每次比赛后,两个数组里元素的相对大小是不变的,可以log(n)的时间复杂度达到同样的效果// //sort(s+1,s+n+1,cmp);// //做法一:调用函数// merge(lose+1,lose+n/2+1,win+1,win+n/2+1,s+1);}de(a[q])return 0;
}

P1309 [NOIP2011 普及组] 瑞士轮-快排+归并排序相关推荐

  1. 信息学奥赛一本通 1955:【11NOIP普及组】瑞士轮 | OpenJudge NOI 4.1 4363:瑞士轮 | 洛谷 P1309 [NOIP2011 普及组] 瑞士轮

    [题目链接] ybt 1955:[11NOIP普及组]瑞士轮 OpenJudge NOI 4.1 4363:瑞士轮 洛谷 P1309 [NOIP2011 普及组] 瑞士轮 [题目考点] 1. 归并排序 ...

  2. P1309 [NOIP2011 普及组] 瑞士轮

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

  3. [NOIP2011 普及组] 瑞士轮

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

  4. NOIP2011普及组 瑞士轮

    看到题解区之后明白了自己居然脑补出伪的归并排序了 (我才知道如何在Markdown中打空行了--) 洛谷-题目链接-瑞士轮 不得不说其实这题很好想或者说是灵光一现.但是在写代码的时候不知道脑子是不是抽 ...

  5. P1307 [NOIP2011 普及组] 数字反转(python3实现)

    https://www.luogu.com.cn/problem/P1307 """P1307 [NOIP2011 普及组] 数字反转 https://www.luogu ...

  6. 信息学奥赛一本通 1956:【11NOIP普及组】表达式的值 | 洛谷 P1310 [NOIP2011 普及组] 表达式的值

    [题目链接] ybt 1956:[11NOIP普及组]表达式的值 洛谷 P1310 [NOIP2011 普及组] 表达式的值 [题目考点] 表达式树 由带括号的中缀表达式构建表达式树 [解题思路] 思 ...

  7. 信息学奥赛一本通 1089:数字反转 | 1953:【11NOIP普及组】数字反转 | OpenJudge NOI 1.5 29 | 洛谷 P1307 [NOIP2011 普及组] 数字反转

    [题目链接] ybt 1089:数字反转 ybt 1953:[11NOIP普及组]数字反转 OpenJudge NOI 1.5 29:数字反转 洛谷 P1307 [NOIP2011 普及组] 数字反转 ...

  8. 洛谷——P1307 [NOIP2011 普及组] 数字反转

    P1307 [NOIP2011 普及组] 数字反转 题目描述 给定一个整数,请将该数各个位上数字反转得到一个新数.新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应 ...

  9. 信息学奥赛一本通 1400:统计单词数 | 1954:【11NOIP普及组】统计单词数 | OpenJudge NOI 1.12 05 | 洛谷 P1308 [NOIP2011 普及组] 统计单词数

    [题目链接] ybt 1400:统计单词数 ybt 1954:[11NOIP普及组]统计单词数 OpenJudge NOI 1.12 05:统计单词数 洛谷 P1308 [NOIP2011 普及组] ...

最新文章

  1. 9月22日 奇怪的贸易
  2. 联想台式机网卡驱动_【装机帮扶站】第339期:联想刃7000:是否还有选购价值?4000价位装机推荐...
  3. python工业自动化仿真_ABAQUS 中基于 Python 脚本语言开发实现仿真自动化操作
  4. DOS命令之ping命令大全详解
  5. Redis存储揭秘(翻译)
  6. excel 绘制突显的饼图
  7. matlab建模方法,MATLAB 数学建模方法与实践(第 3 版)
  8. matlab电压模块,matlab simpowersystems电路仿真模块.doc
  9. 学计算机的制作水印,如何设置属于自己的水印,电脑上制作属于自己的文字水印...
  10. rovio环境配置与测试笔记
  11. (混沌序列统计特性)Maurer通用统计测试---matlab
  12. Python pygame 坦克大战
  13. Yolov5目标检测环境搭建过程(Cuda+Pytorch+Yolov5)
  14. Stata学习手册——第一讲
  15. 20X25 FCPX插件24种视频网站点赞订阅关注MG动画效果 Youtube Subscribe Generators
  16. 五轴数控转台_什么是五轴联动数控机床
  17. Very Deep Convolutional Networks for Large-Scale Image Recognition—VGG论文翻译—中文版
  18. linux命令:find、打包解包、vi编辑器、用户权限
  19. java装了1.8,更换成11后,-version还是显示java8的解决方法
  20. 1 - 概率论与数理统计

热门文章

  1. 一款真正可用的支付系统,可搭建自己的易支付系统,开源无后门可运营
  2. Redis-SETNX命令简介
  3. 一字节BCD码转ASCII码的算法及源码
  4. 为什么你和同事关系处不好?
  5. OpenCV-Python[第三章]——位操作
  6. big sur 虚拟机 网络_推荐收藏系列:一文理解JVM虚拟机(内存、垃圾回收、性能优化)解决面试中遇到问题...
  7. 大数据这么火,什么是大数据呢?
  8. windows命令行连接远程服务器MongoDB
  9. C#短网址压缩算法与短网址原理入门
  10. 计算机管理没有固态硬盘,电脑的BIOS中没有固态硬盘启动选项怎么办?