洛谷P1309 瑞士轮(归并排序)
题目背景
在双人对决的竞技性比赛,如乒乓球、羽毛球、国际象棋中,最常见的赛制是淘汰赛和循环赛。前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高。后者的特点是较为公平,偶然性较低,但比赛过程往往十分冗长。
本题中介绍的瑞士轮赛制,因最早使用于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 的选手的编号。
输入输出样例
2 4 2
7 6 6 7
10 5 20 15
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≤10^8,1 ≤w1, w2 , …, w2N≤ 10^8。
noip2011普及组第3题。
思路:
排序,不过快排也会超时,需要用归并排序,因为每次竞赛后,胜利者和失败者依然是按照得分从大到小的顺序产生的。
代码:
归并排序:
#include<cstdio>
#include<algorithm>
using namespace std; const int maxn=;
int n,r,q,size;
struct competitor
{
int num,score,force;
}comp[maxn*],winner[maxn],loser[maxn]; void read(int &now)
{
now=;
char word=getchar();
while(word<'' || word>'')
word=getchar();
while(word>='' && word<='')
now=now*+word-'',word=getchar();
}
void output(int now)
{
int num=;
char c[];
while(now) c[++num]=(now%)+'',now/=;
while(num) putchar(c[num--]);
putchar('\n');
} bool cmpSC(competitor x,competitor y)
{
if(x.score == y.score)
return x.num < y.num;
return x.score > y.score;
}
void mergesort()
{
int nowl=,nowr=,nowc=;
while(nowl<=size && nowr<=size)
{
if(winner[nowl].score < loser[nowr].score)
comp[++nowc]=loser[nowr++];
else if(winner[nowl].score > loser[nowr].score)
comp[++nowc]=winner[nowl++];
else if(winner[nowl].num < loser[nowr].num)
comp[++nowc]=winner[nowl++];
else
comp[++nowc]=loser[nowr++];
}
while(nowl<=size)
comp[++nowc]=winner[nowl++];
while(nowr<=size)
comp[++nowc]=loser[nowr++]; /*while(nowc<n)
{
if(nowl>size)
{
while(nowr<=size)
comp[++nowc]=loser[nowr++];
break;
}
if(nowr>size)
{
while(nowl<=size)
comp[++nowc]=winner[nowl++];
break;
}
if(winner[nowl].score<loser[nowr].score||(winner[nowl].score==loser[nowr].score && winner[nowl].num>loser[nowr].num))
comp[++nowc]=loser[nowr++];
else
comp[++nowc]=winner[nowl++];
}*/
}
void march()
{
int now=;
//sort(comp+1,comp+1+n*2,cmpSC);
size=;
while(now<=n)
{
if(comp[now].force > comp[now+].force)
++comp[now].score,winner[++size]=comp[now],loser[size]=comp[now+];
else
++comp[now+].score,winner[++size]=comp[now+],loser[size]=comp[now];
now+=;
}
mergesort();
} int main()
{
read(n);read(r);read(q);
n<<=;
for(int i=;i<=n;i++)
{
read(comp[i].score);
comp[i].num=i;
}
for(int i=;i<=n;i++)
read(comp[i].force);
sort(comp+,comp++n,cmpSC);
while(r--)
march();
output(comp[q].num);
/*for(int i=1;i<=n*2;i++)
printf("%d %d\n",comp[i].num,comp[i].score);*/
return ;
}
AC
快排(60分 TLE四个点):
#include<cstdio>
#include<algorithm>
using namespace std; const int maxn=;
int n,r,q;
struct competitor
{
int num,score,force;
}comp[maxn*]; void read(int &now)
{
now=;
char word=getchar();
while(word<'' || word>'')
word=getchar();
while(word>='' && word<='')
now=now*+word-'',word=getchar();
}
void output(int now)
{
int num=;
char c[];
while(now) c[++num]=(now%)+'',now/=;
while(num) putchar(c[num--]);
putchar('\n');
} bool cmpSC(competitor x,competitor y)
{
if(x.score == y.score)
return x.num > y.num;
return x.score < y.score;
}
void march()
{
int now=n*;
sort(comp+,comp++n*,cmpSC);
while(now)
{
if(comp[now].force > comp[now-].force)
++comp[now].score;
else
++comp[now-].score;
now-=;
}
} int main()
{
read(n);read(r);read(q);
for(int i=;i<=*n;i++)
{
read(comp[i].score);
comp[i].num=i;
}
for(int i=;i<=*n;i++)
read(comp[i].force);
int now=r;
while(now--)
march();
sort(comp+,comp++n*,cmpSC);
output(comp[n*-q+].num);
/*for(int i=1;i<=n*2;i++)
printf("%d %d\n",comp[i].num,comp[i].score);*/
return ;
}
TLE
洛谷P1309 瑞士轮(归并排序)的更多相关文章
- 洛谷 - P1309 - 瑞士轮 - 归并排序
https://www.luogu.org/problemnew/show/P1309 一开始写的直接快排没想到真的TLE了. 想到每次比赛每个人前移的量不会很多,但是不知从哪里开始优化. 搜索一下原 ...
- 洛谷 P1309 瑞士轮 解题报告
P1309 瑞士轮 题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公平,偶然性较低 ...
- 洛谷P1309——瑞士轮(归并排序)
https://www.luogu.org/problem/show?pid=1309#sub 题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点 ...
- NOIP2011 普及组 T3 洛谷P1309 瑞士轮
今天题做太少,放道小题凑数233 题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公 ...
- 洛谷 P1309 瑞士轮
题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公平,偶然性较低,但比赛过程往往十分 ...
- 洛谷P1309 瑞士轮
传送门 题目大意: 2*n个人,有初始的比赛分数和实力值. 每次比赛前总分从大到小排序,总分相同编号小的排在前面. 每次比赛是1和2比,3和4比,5和6比. 实力值大的获胜得1分. 每次比赛前排序确定 ...
- 洛谷 P1309 瑞士轮 题解
每日一题 day4 打卡 Analysis 暴力+快排(其实是归并排序) 一开始天真的以为sort能过,结果光荣TLE,由于每次只更改相邻的元素,于是善于处理随机数的快排就会浪费很多时间.于是就想到归 ...
- 洛谷P1309 瑞士轮——题解
题目传送 思路非常简单,只要开始时把结构体排个序,每次给赢的加分再排序,共r次,最后再输出分数第q大的就行了. (天真的我估错时间复杂度用每次用sort暴力排序结果60分...)实际上这道题估算时间复 ...
- P1309 瑞士轮 (吸氧了)
P1309 瑞士轮 题解 1.这题可以模拟一下 2.sort吸氧可以过(可能是排序有点慢吧,不开会T) sort排序时注意: return 1 是满足条件,不交换 return 0是不满足,交换 代码 ...
随机推荐
- 雅礼 noip2018 模拟赛 day3 T3
典型树形dp 这里,我们应该看到一些基本性质: ①:如果这个边不能改(不是没有必要改),我们就不改,因为就算改过去还要改回来,显然不是最优的 注意:"不能改"是指边的性质和要求的相 ...
- Python字典(Dictionary)
Python中字典与类表类似,也是可变序列,不过与列表不同,他是无序的可变序列,保存的内容是以键 - 值对的形式存放的.类似我们的新华字典,他可以把拼音和汉字关联起来,通过音节表可以快速的找到想要的字 ...
- C++ Primer 笔记——变量
1. 初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新值来代替. 2.使用列表初始化内置类型的变量时,如果初始值存在丢失信息的风险,则编译器将报错 ...
- Linux桌面环境安装matlab并创建快捷方式
安装matlab sudo mkdir -p /mnt/matlab sudo mount -t auto -o loop /home/chris/Downloads/2016b_linux/R201 ...
- android app使用微信登录接口回调没有被执行的问题研究
本人开发的一个app使用了sharesdk集成微信登录功能,在测试的过程中微信授权登录界面有调用,但是授权后原应用的回调没有被执行 应用的包名是com.kimi.searcher 首先,确认微信点击授 ...
- gradle repo conf - maven-central.storage-download.googleapis.com
repositories { google() jcenter() maven { // The google mirror is less flaky than mavenCentral() url ...
- springboot调用http方式
1.httpclient 2.okhttp 3.feign 安装Gradle包 compile 'org.springframework.cloud:spring-cloud-starter-open ...
- Ansible playbook 部署Openresty
- hosts: all tasks: - name: copy package copy: src=/usr/local/openresty-1.13.6.1.tar.gz dest=/usr/lo ...
- 最长k可重区间集问题&&最长k可重线段集问题
题解: 洛谷上这两题的题意都是有问题的 按照标程题意不应该是开区间而是左开右闭区间 然后连边比较巧妙 我们可以看成选k条不相交的路径,其中i-i+1中有k条边 所以建图i-i+1流量为k,权值为0 l ...
- 禁止root直接登陆linux系统
直接修改文件 # vim /etc/ssh/sshd_config SyslogFacility AUTHPRIV PermitRootLogin no RSAAuthentication yes P ...