比赛日程安排

题目是这样的

1、    设有n个球队要进行排球循环赛,设计一个满足以下要求的比赛日程表:

a)     每个球队必须与其他n-1个球队各赛一次;

b)     每个球队一天只能赛一次;

c)     当n是偶数时,循环赛进行n-1天。当n是奇数时,循环赛进行n天。

n=6的比赛日程表示例(把6个队从1到6进行编号):

分析一下:

假设n为偶数,一共得比赛场次是(n*(n-1))/2 ,每天最多比赛 n/2场.所以一共需要比赛n-1天。

n为奇数时,可以补0,添加为偶数。 与0匹配的时表示轮空。

网上的思路:

思路是 1位置保持不动,其余几位逆时针旋转,一共旋转n-1次。这样可以保证,每天每人 比赛一次。且不重复。

---
1 4 
2 5 
3 6  
---
1 5 
4 6 
2 3 
--- 
1 6 
5 3 
4 2 
--- 
1 3 
6 2 
5 4 
---- 
1 2 
3 4 
6 5

C++实现如下:

#include<stdio.h>
#include<string.h>
#include <vector>

using namespace std;
int main()
{
    std::vector<int>a;
    int n;
    scanf("%d",&n);
    for(int i = 0; i < n; i++)
    {
        a.push_back(i+1);
    }
    if(a.size() % 2)
        a.push_back(0);

    n = a.size();
    int mid = n/2;
    int s1[35],s2[35];
    if(n<=2) return 0;
    for(int i = 0; i < mid; i++)
    {
        s1[i] = a[i];
        s2[i] = a[i+mid];
    }

    for(int i = 0; i < n-1; i++)
    {
        printf("day =============%d\n\n",i+1);
        for(int j = 0; j < mid; j++)
        {
            printf("%d %d\n",s1[j],s2[j]);
        }

        int tmp = s1[1];
        for(int j = 1;j < mid-1; j++)
        {
            s1[j] = s1[j+1];
        }
        s1[mid-1] = s2[mid-1];
        for(int j = mid-1;j >= 1; j--)
        {
            s2[j] = s2[j-1];
        }
        s2[0] = tmp;
    }
    return 0;
}

  

时间: 2024-10-01 08:01:29

比赛日程安排的相关文章

编程练习赛41:题目1 : 比赛日程安排

题目1 : 比赛日程安排 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 H国编程联赛中有N只队伍,编号1~N. 他们计划在2018年一共进行M场一(队)对一(队)的比赛. 为了让参赛队员能得到充分的休息,联赛组委会决定:每支队伍连续两场比赛之间至少间隔一天.也就是如果A队1月1日参加了一场比赛,那么下一场比赛最早安排在1月3日. 给定M场比赛的时间和参赛的两支队伍,请你判断这个日程安排是否可行. 输入 第一行包含一个整数T,代表测试数据组数.(1 ≤ T ≤ 10

HihoCoder1670 : 比赛日程安排([Offer收割]编程练习赛41)(模拟)

描述 H国编程联赛中有N只队伍,编号1~N. 他们计划在2018年一共进行M场一(队)对一(队)的比赛. 为了让参赛队员能得到充分的休息,联赛组委会决定:每支队伍连续两场比赛之间至少间隔一天.也就是如果A队1月1日参加了一场比赛,那么下一场比赛最早安排在1月3日. 给定M场比赛的时间和参赛的两支队伍,请你判断这个日程安排是否可行. 输入 第一行包含一个整数T,代表测试数据组数.(1 ≤ T ≤ 10) 对于每组数据,第一行包含两个整数N和M.(1 ≤ N ≤ 50, 1 ≤ M ≤ 1000)

循环赛日程安排问题

问题描写叙述:    设有n(n=2^k)支队伍參加循环赛,循环赛共进行n-1天,每支队伍要与其它n-1支队伍比赛一场,且每支队伍每天必须比赛一场,不能轮空.试按此要求为比赛安排日程. 算法思路:   我们先安排奇数下标位置与偶数下标位置之间的比赛,就有n/2场,方法非常easy,team[2k]=2k,全部奇数号组成一个序列[1,3...n-1],然后循环移动n/2-1次(比方第2个序列就是[3,5...n-1,1]),然后将该序列填充在team的奇数位置上. 接下来将队伍一分为二,奇数为一组

八大算法思想

八大算法思想分别是:枚举.递推.递归.分治.贪心.试探法.动态迭代和模拟算法思想. 1.比较“笨”的枚举算法思想 枚举最大的缺点是运算量比较大,解题效率不高. 如果题目的规模不是很大,在规定的时间与空间限制内能够求出解,那么最好是采用枚举法,而无须太在意是够还有更快的算法,这样可以使你有更多的时间去解答其他难题. //枚举法解决“填写运算符”的问题 import java.util.Scanner; public class meijujisuan5ge5 { public static voi

(一)八大算法思想

八大算法 八大算法:枚举.递推.递归.分治.贪心.试探法.动态迭代和模拟算法思想. 一.枚举算法思想(暴力算法) 将问题的所有可能答案一一列举,根据判断条件判断此答案是否合适,一般用循环实现. 经典运用:百钱买百鸡.填写运算符 二.递推算法思想 1.顺推法:从已知条件出发,逐步推算出要解决问题的方法. 2.逆推法:从已知结果出发,用迭代表达式逐步推算出问题开始的条件,即顺推法的逆过程. 经典运用:斐波那契数列(顺推法).银行存款(逆推法) 三.递归算法思想 1.递归过程一般通过函数或子过程实现:

分治 赛程安排

问题描述:有n个运动员进行循环赛,要求设计满足一下要求的日程表 1.  每两人必须比赛一次且只比赛一次 2.  每个选手每天只能比赛一次 3.  要求比赛时间尽可能短(即n为偶数时比赛n-1天,n为奇数时比赛n天) 一.分治法 算法思想,先算n/2的日程表,然后将循环赛日程表左上复制到右下,左下复制到右上,得到n的日程表,递归实现 #include <stdio.h> #define N 1000 int a[N][N]; int b[N]; bool odd(int n) { return

九度oj 题目1499:项目安排

题目描述: 小明每天都在开源社区上做项目,假设每天他都有很多项目可以选,其中每个项目都有一个开始时间和截止时间,假设做完每个项目后,拿到报酬都是不同的.由于小明马上就要硕士毕业了,面临着买房.买车.给女友买各种包包的鸭梨,但是他的钱包却空空如也,他需要足够的money来充实钱包.万能的网友麻烦你来帮帮小明,如何在最短时间内安排自己手中的项目才能保证赚钱最多(注意:做项目的时候,项目不能并行,即两个项目之间不能有时间重叠,但是一个项目刚结束,就可以立即做另一个项目,即项目起止时间点可以重叠). 输

BZOJ1725: [Usaco2006 Nov]Corn Fields牧场的安排

1725: [Usaco2006 Nov]Corn Fields牧场的安排 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 400  Solved: 290[Submit][Status] Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地.FJ打算在牧场上的某几格土地里种上美味的草,供他的奶牛们享用.遗憾的是,有些土地相当的贫

NOJ 1163 活动安排问题 [动态规划]

活动安排问题 时间限制(普通/Java) : 3000 MS/ 9000 MS 运行内存限制 : 65536 KByte总提交 : 202            测试通过 : 55 比赛描述 设有n个活动的集合E={1,2,--,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源.每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si<fi.如果选择了活动i,则它在时间区间[si,fi]内占用资源.若区间[si,fi]与区间[sj,fj