To 洛谷.1309 瑞士轮

题目背景

在双人对决的竞技性比赛,如乒乓球、羽毛球、国际象棋中,最常见的赛制是淘汰赛和循环赛。前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高。后者的特点是较为公平,偶然性较低,但比赛过程往往十分冗长。

本题中介绍的瑞士轮赛制,因最早使用于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≤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 瑞士轮(归并排序)的更多相关文章

  1. 洛谷 - P1309 - 瑞士轮 - 归并排序

    https://www.luogu.org/problemnew/show/P1309 一开始写的直接快排没想到真的TLE了. 想到每次比赛每个人前移的量不会很多,但是不知从哪里开始优化. 搜索一下原 ...

  2. 洛谷 P1309 瑞士轮 解题报告

    P1309 瑞士轮 题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公平,偶然性较低 ...

  3. 洛谷P1309——瑞士轮(归并排序)

    https://www.luogu.org/problem/show?pid=1309#sub 题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点 ...

  4. NOIP2011 普及组 T3 洛谷P1309 瑞士轮

    今天题做太少,放道小题凑数233 题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公 ...

  5. 洛谷 P1309 瑞士轮

    题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公平,偶然性较低,但比赛过程往往十分 ...

  6. 洛谷P1309 瑞士轮

    传送门 题目大意: 2*n个人,有初始的比赛分数和实力值. 每次比赛前总分从大到小排序,总分相同编号小的排在前面. 每次比赛是1和2比,3和4比,5和6比. 实力值大的获胜得1分. 每次比赛前排序确定 ...

  7. 洛谷 P1309 瑞士轮 题解

    每日一题 day4 打卡 Analysis 暴力+快排(其实是归并排序) 一开始天真的以为sort能过,结果光荣TLE,由于每次只更改相邻的元素,于是善于处理随机数的快排就会浪费很多时间.于是就想到归 ...

  8. 洛谷P1309 瑞士轮——题解

    题目传送 思路非常简单,只要开始时把结构体排个序,每次给赢的加分再排序,共r次,最后再输出分数第q大的就行了. (天真的我估错时间复杂度用每次用sort暴力排序结果60分...)实际上这道题估算时间复 ...

  9. P1309 瑞士轮 (吸氧了)

    P1309 瑞士轮 题解 1.这题可以模拟一下 2.sort吸氧可以过(可能是排序有点慢吧,不开会T) sort排序时注意: return 1 是满足条件,不交换 return 0是不满足,交换 代码 ...

随机推荐

  1. Nginx详解五:Nginx基础篇之HTTP请求

    http请求 如今的http请求已经不是每一次请求都进行一次三次握手,可以在请求与相应之后,客户端和服务端不断的发送FIN和ACK包来保持连接的状态,即:长连接 HTTP请求建立在一次TCP连接基础上 ...

  2. 一道面试题 vuex缺点?

    最近去面试的时候,面试官有一道题是让我阐述用vuex的优缺点,优点倒还好说,这个缺点还真没有认识到,有道友可以帮忙解惑嘛? 2 回答 慕标5265247 这种问题一般都有通用回答套路.一件挺好的东西, ...

  3. unzip文件解压

    1.记录下,遇到.zip的安装包,指定解压到某个地方 格式:unzip      压缩包名.zip  -d   存放路径  

  4. 647. Palindromic Substrings

    Given a string, your task is to count how many palindromic substrings in this string. The substrings ...

  5. 什么是redis的雪崩和穿透

    缓存雪崩 如何应对缓存雪崩 首先要保证redis的高可用,可以使用redis cluster,开启redis持久化,redis之前要使用本地缓存,请求先走本地缓存,没找到再走redis 如果还是出现了 ...

  6. mysql存储过程的学习(mysql提高执行效率之进阶过程)

    1:存储过程: 答:存储过程是sql语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理:存储过程存储在数据库内,可以由应用程序调用执行,而且允许用户声明变量以及进行流程控制,存储类型可以接受 ...

  7. C#学习-静态

    有提过类的成员,有字段.属性.方法和构造函数等,也可以使用static关键字将其声明为类的静态成员. 静态成员属于类级别的概念,它不属于类的实例. 可以使用static关键字来声明静态字段,静态字段与 ...

  8. 安装和强行卸载fuse

    先卸载 yum list fuse yum --setopt=tsflags=noscripts remove fuse.x86_64 安装 yum install automake gcc-c++ ...

  9. DBEntityEntry类

    DBEntityEntry是一个重要的类,可用于检索有关实体的各种信息.您可以使用DBContext的Entry方法获取特定实体的DBEntityEntry实例. DBEntityEntry允许您访问 ...

  10. [转] iOS9系统自带字体

    Family: Thonburi Font: Thonburi-Bold Font: Thonburi Font: Thonburi-Light 1 2 3 4 Family: Khmer Sanga ...