洛谷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是不满足,交换 代码 ...
随机推荐
- HTML&javaSkcript&CSS&jQuery&ajax(三)
一.HTML块元素 1.块级元素 Block level element ,内联元素 inline element , HTML<div>元素属于块级元素,他是组合其他HTML元素的容器, ...
- cf29d 深搜,dfs序
#include<bits/stdc++.h> using namespace std; #define maxn 500 ]; int n,head[maxn],tot,a[maxn], ...
- Eclipse中java文件生成jar文件的方法
在eclpse中找到你要导出的java程序 选中它 单击文件 -->export 在弹出的export对话框中找到 jar File 单击选中-->next 按图示顺序依次 选 ...
- js 浮点数相加 变成字符串 解决方案
var count = 0; count+=Number(parseFloat(value[i]['sla']).toFixed(2)); 数字相加的时候最好使用Number转换一下
- 根据ip地址获得国家和城市(C#)
/// <summary> /// get country and city /// </summary> /// <param name="ip"& ...
- 步步为营-76-用户登录(Session+Cookie)
说明:cookie是保存在浏览器的.Session是存储在服务器的 1 同样UI页面还是web前端提供 1.1 首先,经过验证码校验:将系统产生的验证码放入到Session中,然后取Session值注 ...
- ID3算法下的决策树
网上的内容感觉又多又乱,自己写一篇决策树算法.希望对别人有所启发,对自己也是一种进步. 决策树 须知概念 信息熵 & 信息增益 熵: 熵(entropy)指的是体系的混乱的程度,在不同的学科中 ...
- 三 os模块
os模块是与操作系统交互的一个接口 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录:相 ...
- pycharm创建python模板文件
1.新建一个项目: 2.右键单击项目名称-->选择新建-->编辑模板文件 3.编辑模板文件保存 4.新建文件测试 至此不再重复添加头部信息了
- net core体系-web应用程序-4asp.net core2.0 项目实战(1)-4项目前端说明
本文目录1. 摘要2. UI界面展示 3. 主要技术点4. 总结 1. 摘要 平时比较忙,写一篇文章可能跨度好几天,希望各位多多包涵.闲言少叙直接进入正题. 2. UI界面 NCMVC用的就图二, ...