题目背景

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

本题中介绍的瑞士轮赛制,因最早使用于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题。

冷静分析

最暴力的肯定是每battle一次都进行一次结构体快速排序,但是太慢了,60分。

经我们冷静分析可以发现一些特殊性质,也就是说,一次battle下来,因为有之前的“积分有序性”,所以新的排名并不会有太大的变化。卡sort的情况下,我们可以考虑稳定的归并,O(nlogn);

这里使用了一种类mergesort;

注释写在代码里。

 #include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,r,e;
struct node
{
int score,pos,abi;
};
node q[],win[],lose[];//win和lose保证有序。
bool cmp(node a,node b)
{
if(a.score==b.score) return a.pos<b.pos;
return a.score>b.score;
}
void merge()
{//类归并
int tmp=n/;//注意。win和lose中元素个数各为tmp个
int i=,j=,k=;
while(i<=tmp&&j<=tmp)
{
if(win[i].score>lose[j].score||(win[i].score==lose[j].score&&win[i].pos<lose[j].pos))
{
q[k]=win[i];
i++;k++;
}
else
{
q[k]=lose[j];
j++;k++;
}
}//下面的while循环,要么执行第一个,要么执行第二个,因为当 上一循环跳出时总有一条件不符合。
while(i<=tmp)
{
q[k]=win[i];
i++;k++;
}
while(j<=tmp)
{
q[k]=lose[j];
j++;k++;
}
}
int main()
{
scanf("%d%d%d",&n,&r,&e);
n=*n;//小细节
for(int i=;i<=n;i++)
{
scanf("%d",&q[i].score);
q[i].pos=i;//pos代表初始编号
}
for(int i=;i<=n;i++) scanf("%d",&q[i].abi);
sort(q+,q+n+,cmp);
for(int i=;i<=r;i++)
{//num在表示第几次battle,及其结果。
int num=;//注意num是用于一次battle下来的,一次battle要走完下面的循环,注意定义位置。
for(int j=;j<=n;j+=)//步长加至2.
{
if(q[j].abi>q[j+].abi)
{
q[j].score ++;
num++;
win[num]=q[j];//第num个赢的人
lose[num]=q[j+];//第num个输的人
}
else
{
q[j+].score ++;
num++;
win[num]=q[j+];
lose[num]=q[j];
}
}
merge();//两两battle后统一排序
}
printf("%d",q[e].pos);
return ;
}

大道至简!

luogu P1309 瑞士轮【排序】的更多相关文章

  1. P1309 瑞士轮 排序选择 时间限制 归并排序

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

  2. P1309 瑞士轮 (吸氧了)

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

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

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

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

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

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

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

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

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

  7. P1309 瑞士轮

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

  8. 洛谷 P1309 瑞士轮

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

  9. P1309 瑞士轮 未完成 60

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

随机推荐

  1. FatMouse's Speed--hdu1160(dp+输出路径)

    Problem Description FatMouse believes that the fatter a mouse is, the faster it runs. To disprove th ...

  2. Best Time to Buy and Sell Stock(动态规划)

    Say you have an array for which the ith element is the price of a given stock on day i. If you were ...

  3. 原生js操作dom的方法

    今天学习了原生js的dom节点的操作,就记录下来,仅供自己以后参考. 1)创建节点:除了可以使用createElement创建元素,也可以使用createTextNode创建文本节点. documen ...

  4. Storm专题二:Storm Trident API 使用具体解释

    一.概述      Storm Trident中的核心数据模型就是"Stream",也就是说,Storm Trident处理的是Stream.可是实际上Stream是被成批处理的. ...

  5. js 计算两个日期之间 相差几年几月几日

    1.计算日期差 Mine.vue <!-- 我的 --> <template> <div> <!-- 标题栏 --> <x-header :lef ...

  6. nyoj473 A^B Problem (高速幂)

    题目473 题目信息 执行结果 pid=473" style="text-decoration:none; color:rgb(55,119,188)">本题排行 ...

  7. ldd

    ldd命令用于判断某个可执行的 binary 档案含有什么动态函式库 [diego@localhost ~/work/branch_dispatch_201511/rtqa_center/source ...

  8. SLF4J: Failed to load class的问题及解决

    今天在做接口测试,一运行测试程序,就跳出这样一个大大的错误: SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”. SLF4 ...

  9. JIRA运行太慢,修改JVM

    JIRA运行太慢,根据实际实况,修改JVM内存大小 2. 非NT服务修改JVM内存大小 修改%JIRA_HOME%/bin下面的setenv.bat文件,修改JAVA_OPTS这个环境变量 set J ...

  10. leetcode:122. Best Time to Buy and Sell Stock II(java)解答

    转载请注明出处:z_zhaojun的博客 原文地址 题目地址 Best Time to Buy and Sell Stock II Say you have an array for which th ...