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/ 总时间限制: ...
随机推荐
- sqlserver导入数据到mysql的详细图解
SQL Server 迁移数据到MySQL 一.背景 由于项目开始时候使用的数据库是SQL Server,后来把存储的数据库调整为MySQL,所以需要把SQL Server的数据转移到MySQL:由于 ...
- Linux-防火墙设置-centos6.10版
cd /etc/sysconfig vi iptables 输入i进入编辑模式 打开下图,并按照下图修改 输入esc退出编辑模式 输入保存命令:[:w] 输入退出命令:[:q] 重启防火墙 servi ...
- 3Ddungeon-------三维搜索-----偷个懒 把 亡命逃窜 的代码修改了一下 拿来用了
题 很简单 就是给一个 三维的迷宫然后 开你起始地点 S 问你能不能到达 出口 E 能的话 需要多长时间 ? #include<stdio.h> #include<string ...
- [转]逐步解說:在 WPF 應用程式中使用 ReportViewer 显示 rdlc
本文转自:http://msdn.microsoft.com/zh-tw/library/hh273267 若要在 WPF 應用程式中使用 ReportViewer 控制項,您需要將 ReportVi ...
- Xcode控制台输出中文
创建一个.m文件,然后将一下代码加入.m文件中即可实现控制台输出中文,具体代码如下: #ifndef Release @implementation NSSet(Log) - (NSString *) ...
- https 结合使用 对称加密和非对称加密
(一)对称加密(Symmetric Cryptography) ---共享密钥加密 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥( ...
- Last-Modified If-Modified-Since ETag If-None-Match
Last-Modified.If-Modified-Since 有些数据随时都在变化. CNN.com 的主页经常几分钟就更新.另一方面,Google.com 的主页几个星期才更新一次 (当他们上传特 ...
- Django models 常用字段类型
1.CharField字符串字段,存较短的字符串,长文本要用TextField.必须的参数:max_length 字符的最大长度2.TextField容量很大的文本字段.admin中用 <tex ...
- 安卓学习之学生签到APP(一)
一.学生定位签到页面 具体实现步骤: 1.1 高德地图申请key 1.创建新应用 进入高德地图api控制台,创建一个新应用.如果您之前已经创建过应用,可直接跳过这个步骤. 2.添加新Key 在创建的应 ...
- Linux 与 Windows 文件互传(VMWare)
虚拟机无桌面的Linux 与 物理机Windows 文件互传有很多种方法,现在先说一种通过共享文件夹的形式,其他方法后续再补充 1. 背景 1) 虚拟机系统:VMWare无桌面的 ...