循环比赛

【Problem description】

设有n个选手进行循环比赛,其中n = 2m,要求每名选手要与其他n-1名选手都赛一次,每名选手每天比赛一次,循环赛共进行n - 1天,要求每天没有选手轮空。

【Input format】

一个正整数m(2 <= m <= 6)。

【Output format】

样例形式的比赛安排表。

【Algorithm design】

模拟

【Problem analysis】

模拟:

1 2 3 4 5 6 7 8
2 1 4 3 6 5 8 7
3 4 1 2 7 8 5 6
4 3 2 1 8 7 6 5
5 6 7 8 1 2 3 4
6 5 8 7 2 1 4 3
7 8 5 6 3 4 1 2
8 7 6 5 4 3 2 1

题目样例暴露了规律:每2^i行的下一行就要针对上一行进行长度为2^i单位之间的调换,直接进行O(mn^2)的模拟就可以过。

【Source code】

#include <bits/stdc++.h>

using namespace std;

int m,num[1001];

int check(int x)

{

int mi=0;

while(x)

{

if((x&1))return mi;

x/=2;

mi++;

}

return mi;

}

int main()

{

freopen("match.in","r",stdin);

freopen("match.out","w",stdout);

cin>>m;

for(int i=1;i<=(1<<m);i++)

{

num[i]=i;

cout<<i<<" ";

}//储存第一行

cout<<endl;

for(int i=2;i<=(1<<m);i++)

{

int last=check(i-1);//找到上一行作为2^i的倍数,i的最大值

for(int j=0;j<=last;j++)

for(int k=1;k<=(1<<m);k+=(1<<j+1))

for(int f=1;f<=(1<<j);f++)

swap(num[k+f-1],num[k+f-1+(1<<j)]);//单位格之间进行调换

for(int j=1;j<=(1<<m);j++)

cout<<num[j]<<" ";

cout<<endl;

}

return 0;

}

原文地址:https://www.cnblogs.com/qswx/p/9411313.html

时间: 2024-10-14 03:51:30

循环比赛的相关文章

YTUOJ-世界杯小组赛

Description 注:本题目自由设计,但必须使用类进行代码设计. 世界杯32支参赛队分为八个小组,每个小组分别有四支球队进行比赛,每支球队都必须和其他三支球队进行且只进行一场比赛,每组4个队循环比赛,共打6场(a1-a2;a1-a3;a1-a4;a2-a3;a2-a4;a3-a4),每场比赛90分钟,胜平负分别积3.1.0分.每个小组积分的前两名球队出线进入淘汰赛阶段的1/8决赛,共16支队,即"16强". 每个小组分别有四只球队,其排名按以下规则确定: a.积分高者排名靠前 b

各种图论模型及其解答(转载)

原文转自Jelline blog http://blog.chinaunix.net/uid-9112803-id-411340.html //============================== 在做研究的过程中,发现其实以前觉得没什么用的数学模型或者图论模型,突然间变得非常有用起来.感叹于自己相关知识的不足,于是搜索相关知识进行学习,并分享. 这篇转载的文章对于从事网络方向研究的初级人员有一定帮助,譬如我.对于已经熟悉图论各模型.各细节的人可以直接关闭此网页离开. //=======

各种图论模型及其解答(转)

原文转自Jelline blog http://blog.chinaunix.net/uid-9112803-id-411340.html 摘要: 本文用另一种思路重新组织<图论及其应用>相关知识.首先,用通俗化语言阐述了如何对事物间联系的问题进行图论建模:接着从现实例子出发,给出 各种典型图论模型,每种图论模型对应于图论一个重要内容:再者,介绍相关知识对上述提到的图论模型涉及的问题进行解答:最后,补充一些图论其他知识,包括 图论分支.易混概念. 符号约定: Q(Question)表示对问题描

BUAA_2019_数学建模_期末复习提纲

整理者:FUJI_W 时间: 2020年1月2日 考题回顾 建模部分 填空题 - 英文翻译 纳什均衡 博弈论 队列模型 名词解释 **是什么?请举例说明. 纳什均衡 非纳什均衡 简答题 传染病模型 SIS SIR (15分) 存储模型(允许缺货,不允许缺货)(15分) 仿真部分 判断题(10分) 大多是仿真那一节 填空题(10分) MATLAB的数组赋值,多项式求解: 分布式交互仿真的特点等 简答题(10分) ADAMS(3分) 并行计算树(4分) MATLAB程序书写(水仙花数的计算)(4分)

c 指针 及其位运算循环移动拔河比赛问题代码

week_2_day1_7.7 周一//用字符数组 来实现 字母大小写转换#include<stdio.h>void desc( char *a ,int n){    char  *i = a;    int x = 0 ;    for ( x = 0; x < n ;x ++ )    {                    if ( *i  >= 97 )                        *i-=32;        i++;    }}int main(v

比赛分组 功能描述:两个乒乓球队进行比赛,各出三人。 甲队为A、B、C三人,乙队为X、Y、Z 三人,已经抽签决定了比赛名单。 已知A 不和X 比,C 不和X、Z 比,请问比赛名单是什么。(用到了三重循环)

当时看到题目的时候自己就晕了,不懂什么意思,做出来的结果竟然是一个人比好几个人,当时还觉得一个人可以打几场呢!==!后来求助大神得到了答案,共勉一下吧~~ public static void main(String[] args) { for(int a = 1 ;a<=3;a++){ for(int b = 1 ;b<=3;b++){ for(int c = 1 ;c<=3;c++){ if(a != 1 && c != 1 && c != 3 &am

Java基础--关于分支、循环、数组的部分练习题及详解

**-----分支题-----** 1.定义一个int类型的变量为x并赋值为5,如果x<10,则让x实现自增,并输出x最后的值. package com.eduask;  //包名 public class Test {   //类 public static void main(String[] args) {  //主函数 int x=5; //声明一个int类型的变量并初始化值为5 if(x<10){  //if分支,如果x的值小于10,x=5,符合题意,进入分支 x++;   //x实

HDU 1285 确定比赛名次 Topsort

题目大意:称职的裁判员忘记了比赛的名次,但还记得谁战胜了谁,给定M组条件,例如A->B 表示A战胜了B,保证信息之间不相互排斥,求输出比赛的名次. 题目分析:是明显的拓扑排序: 在此再介绍一下topsort,核心思想是通过给定的有向无环图确定每个点的入度,比如map[i][j]即表示i战胜了j,此时j的入度+1.但如果存在K点的入度为零,则表示没有人战胜了它,那么他即使排名第一的,然后删除该节点,再以该节点为起始节点,将K战胜的队伍入度-1,再重复上述环节. 总结一下就是: pre:建图,确定每

ACM比赛得分排名,HDU 2093

考试排名 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 15541    Accepted Submission(s): 5464 Problem Description C++编程考试使用的实时提交系统,具有即时获得成绩排名的特点.它的功能是怎么实现的呢?我们做好了题目的解答,提交之后,要么"AC",要么错误,不管怎样错法,