zoukankan      html  css  js  c++  java
  • 比赛日程安排

    题目是这样的

    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
    
    ",i+1);
            for(int j = 0; j < mid; j++)
            {
                printf("%d %d
    ",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;
    }
    

      

  • 相关阅读:
    elipse图标注解
    Thrift源码解析--transport
    IDL和生成代码分析
    thrift概述
    less分页阅读
    this与super使用总结(java)
    more分页阅读
    Arrays
    Teigha克隆db的blockTableRecord里面的一个实体
    Teigha的BlockTableRecord获取方法
  • 原文地址:https://www.cnblogs.com/zendu/p/5268343.html
Copyright © 2011-2022 走看看