洛谷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是不满足,交换 代码 ...
随机推荐
- cf219d 基础换根法
/*树形dp换根法*/ #include<bits/stdc++.h> using namespace std; #define maxn 200005 ]; int root,n,s,t ...
- OrCAD Capture CIS 16.6 导出BOM
OrCAD Capture CIS 16.6 一.选择设计文件:菜单:Tools > Bill of Materials... 二.Bill of Materials > Open in ...
- java提取出一个字符串里面的Double类型数字
String str="hh\n1\n22\n798.809\n0.89\n"; String regex="\\d+(?:\\.\\d+)?" ...
- 充分认识Mysql
使用开源产品是一种潮流.在使用之前,我们首先需要对Mysql 有一定的了解,特别是Mysql 的缺点.只有了解其缺点后,我们才知道,能不能真正的应用到我们的业务场景中去. 2.1 Mysql 数据库简 ...
- 论文阅读笔记二十七:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks(CVPR 2016)
论文源址:https://arxiv.org/abs/1506.01497 tensorflow代码:https://github.com/endernewton/tf-faster-rcnn 室友对 ...
- 基于nginx的WebSocket反向代理
系统:windows 版本:nginx 1.4.5 配置内容: location ~ \.do$ { proxy_pass http://192.168.20.102:80 ...
- vs2017初学c++环境配置及使用教程
https://blog.csdn.net/jmpan_sjtu/article/details/79053169 https://blog.csdn.net/luoyu510183/article/ ...
- 卸载win10内置的onenote
powershell命令如下 get-appxpackage *onenote* | remove-appxpackage
- Linux 命令行敲命令 光标移动快捷键
在单词之间跳转,使用Ctrl+左右键. Ctrl+a跳到本行的行首, Ctrl+e则跳到页尾. Ctrl+u删除当前光标前面的文字 ctrl+k-删除当前光标后面的文字 Ctrl+w和Alt+d-对于 ...
- linux 锁定重要文件 更改重要命令
锁定重要文件如下: chattr +i /etc/passwd /etc/shadow /etc/groupp /etc/gshadow 解锁文件 chattr -i /etc/passwd /etc ...