Noip2011瑞士轮题解
- 题目背景
在双人对决的竞技性比赛。如乒乓球、羽毛球、国际象棋中。最常见的赛制是淘汰赛和循环赛。前者的特点是比赛场数少。每场都紧张刺激,但偶然性较高。后者的特点是较为公平,偶然性较低,但比赛过程往往十分冗长。本题中介绍的瑞士轮赛制,因最早使用于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瑞士轮题解的更多相关文章
- [NOIP2011]瑞士轮
noip2011普及组第3题. 题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公平 ...
- 【普及】NOIP2011 瑞士轮
用sort会超时,显而易见. 然后想到了归并.至于为什么把运动员分成输与赢两组,我也不是很清楚,也许换种方式分组也行,但是分成输与赢两组更容易分组与合并. #include<iostream&g ...
- 洛谷 P1309 瑞士轮 题解
每日一题 day4 打卡 Analysis 暴力+快排(其实是归并排序) 一开始天真的以为sort能过,结果光荣TLE,由于每次只更改相邻的元素,于是善于处理随机数的快排就会浪费很多时间.于是就想到归 ...
- 洛谷P1309 瑞士轮——题解
题目传送 思路非常简单,只要开始时把结构体排个序,每次给赢的加分再排序,共r次,最后再输出分数第q大的就行了. (天真的我估错时间复杂度用每次用sort暴力排序结果60分...)实际上这道题估算时间复 ...
- 0025:2011年NOIp普及组真题——瑞士轮题解
题目链接:https://www.luogu.com.cn/problem/P1309 如果是新手可能马上会想到sort排序,每比一次就排一次,但是这样的时间复杂度有点高,只有60分: 这是因为每次比 ...
- P1309 瑞士轮 (吸氧了)
P1309 瑞士轮 题解 1.这题可以模拟一下 2.sort吸氧可以过(可能是排序有点慢吧,不开会T) sort排序时注意: return 1 是满足条件,不交换 return 0是不满足,交换 代码 ...
- NOIP2011 普及组 T3 洛谷P1309 瑞士轮
今天题做太少,放道小题凑数233 题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公 ...
- [NOIP2011普及组]瑞士轮 JAVA实现
题目描述 2*N名编号为1~2N的选手共进行R轮比赛.每轮比赛开始前,以及所有比赛结束后,都会按照总分从高到低对选手进行一次排名.选手的总分为第一轮开始前的初始分数加上已参加过的所有比赛的得分和.总分 ...
- NOIP2011普及组 瑞士轮
OJ地址: https://www.luogu.org/problemnew/show/P1309 http://bailian.openjudge.cn/practice/4031/ 总时间限制: ...
随机推荐
- input点击修改样式
<input id="geren" type="button" value="个人奖励" style="BORDER-TOP ...
- JAVA 中进行网络通信时,通信的程序两端要传输的对象,不仅要序列化,而且这个对象所属的类的名字要完全一样,连包的名字都得一样
如上图项目目录,这是一个简易的QQ,客户端登录的时候要传输用户信息到服务器验证,所以两端都会用到User类的对象,但一开始我在Server端的包名是com.qq.server.common,两端的报名 ...
- Go Server Record
Centos Setup Go yum install glibc-headers gcc-c++ # 一键安装shadowsocks 1. wget --no-check-certificate - ...
- bootstrap模态框和select2合用时input无法获取焦点(转)
在bootstrap的模态框里使用select2插件,会导致select2里的input输入框没有办法获得焦点,没有办法输入. 解决方法: 1. 把页面中的 tabindex="-1&qu ...
- 安卓代码迁移:Make.exe: *** [libs/armabi-v7a/gdbserver] Error 1
解决办法1:安装ndk和eclipse修改为x86操作系统 解决办法2:降低更换NDK版本
- 针对Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1的解决方案
背景:本项目使用JDK1.8 编译maven工程的时候出现如下错误: Failed to execute goal org.apache.maven.plugins:maven-compiler-pl ...
- servlet_获取初始化参数
在web.xml的<servlet>标签中增添 <init-param> <param-name>XXX</param-name> <param- ...
- mui switch 开关js控制打开 & Cannot read property 'toggle' of null
//打开开关 mui('#mySwitch').switch().toggle(); //小开关打开异常的情况解决办法$(".mui-switch-handle").attr(&q ...
- for 循环的反汇编浅析
for 循环 for 循环是使用频度最高的循环结构,我们通过 C 语言反汇编实例,来分析 for 循环结构在计算机底层的原理和构造.首先,我们编写一个简单的 for 循环: 为了方便观察,我们用十六进 ...
- 360 基于 Prometheus的在线服务监控实践
转自:https://mp.weixin.qq.com/s/lcjZzjptxrUBN1999k_rXw 主题简介: Prometheus基础介绍 Prometheus打点及查询技巧 Promethe ...