精华内容
下载资源
问答
  • 网球循环赛

    千次阅读 2017-01-03 14:07:23
     设有n=2^k个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表:  (1)每个选手必须与其他n-1个选手各赛一次;  (2)每个选手一天只能参赛一次;  (3)循环赛在n-1天内结束。  请按此要求将...

      问题描述

         设有n=2^k个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表:

             (1)每个选手必须与其他n-1个选手各赛一次;
         (2)每个选手一天只能参赛一次;
         (3)循环赛在n-1天内结束。

         请按此要求将比赛日程表设计成有n行和n-1列的一个表。在表中的第i行,第j列处填入第i个选手在第j天所遇到的选手。其中1≤i≤n,1≤j≤n-1。8个选手的比赛日程表如下图:


         算法思路按分治策略,我们可以将所有的选手分为两半,则n个选手的比赛日程表可以通过n/2个选手的比赛日程表来决定。递归地用这种一分为二的策略对选手进行划分,直到只剩下两个选手时,比赛日程表的制定就变得很简单。这时只要让这两个选手进行比赛就可以了。如上图,所列出的正方形表是8个选手的比赛日程表。其中左上角与左下角的两小块分别为选手1至选手4和选手5至选手8前3天的比赛日程。据此,将左上角小块中的所有数字按其相对位置抄到右下角,又将左下角小块中的所有数字按其相对位置抄到右上角,这样我们就分别安排好了选手1至选手4和选手5至选手8在后4天的比赛日程。依此思想容易将这个比赛日程表推广到具有任意多个选手的情形。

        算法步骤

         (1)用一个for循环输出日程表的第一行 for(int i=1;i<=N;i++) a[1][i] = i

         (2)然后定义一个m值,m初始化为1,m用来控制每一次填充表格时i(i表示行)和j(j表示列)的起始填充位置。

         (3)用一个for循环将问题分成几部分,对于k=3,n=8,将问题分成3大部分,第一部分为,根据已经填充的第一行,填写第二行,第二部分为,根据已经填充好的第一部分,填写第三四行,第三部分为,根据已经填充好的前四行,填写最后四行。for (ints=1;s<=k;s++)  N/=2; 

         (4)用一个for循环对③中提到的每一部分进行划分for(intt=1;t<=N;t++)对于第一部分,将其划分为四个小的单元,即对第二行进行如下划分


         同理,对第二部分(即三四行),划分为两部分,第三部分同理。

          (5) 最后,根据以上for循环对整体的划分和分治法的思想,进行每一个单元格的填充。填充原则是:对角线填充

         for(int i=m+1;i<=2*m;i++) //i控制行      

              for(int j=m+1;j<=2*m;j++)  //j控制列       

              { 

                  a[i][j+(t-1)*m*2]= a[i-m][j+(t-1)*m*2-m];/*右下角的值等于左上角的值 */ 

                  a[i][j+(t-1)*m*2-m] =a[i-m][j+(t-1)*m*2];/*左下角的值等于右上角的值 */

             }   

         运行过程

        (1)由初始化的第一行填充第二行

         

         (2)由s控制的第一部分填完。然后是s++,进行第二部分的填充

        

         (3)最后是第三部分的填充

         

         程序清单

    [cpp]  view plain  copy
    1. //2d11 分治法,循环赛事日程表  
    2. #include "stdafx.h"  
    3. #include <iostream>      
    4. #include <math.h>  
    5. using namespace std;   
    6.   
    7. void Table(int k,int n,int **a);  
    8. void input(int &k);  
    9. void output(int **a,int n);  
    10.   
    11. int main()  
    12. {  
    13.     int k;  
    14.     input(k);  
    15.   
    16.     int n=1;  
    17.     //n=2k(k>=1)个选手参加比赛  
    18.     for(int i=1; i<=k; i++)  
    19.         n *= 2;  
    20.   
    21.     //根据n动态分配二维数组a  
    22.     int **a = new int *[n+1];  
    23.     for(int i=0;i<=n;i++)  
    24.     {  
    25.         a[i] = new int[n+1];  
    26.     }  
    27.   
    28.   
    29.     Table(k,n,a);  
    30.   
    31.     cout<<"循环赛事日程表为:"<<endl;  
    32.     output(a,n);  
    33.   
    34.     //释放空间  
    35.     for(int i=0;i<=n;i++)  
    36.     {  
    37.         delete[] a[i];  
    38.     }  
    39.     delete[] a;  
    40.   
    41.     return 0;  
    42. }  
    43.   
    44. void input(int &k)  
    45. {  
    46.     cout<<"请输入k值:"<<endl;  
    47.     cin>>k;  
    48. }  
    49.   
    50. void output(int **a,int n)  
    51. {  
    52.     for(int i=1; i<=n; i++)  
    53.     {  
    54.         for(int j=1; j<=n; j++)  
    55.         {  
    56.             cout<<a[i][j]<<" ";  
    57.         }  
    58.         cout<<endl;  
    59.     }  
    60. }  
    61.   
    62. void Table(int k,int n,int **a)  
    63. {  
    64.     for(int i=1; i<=n; i++)  
    65.         a[1][i]=i;//设置日程表第一行  
    66.   
    67.     int m = 1;//每次填充时,起始填充位置  
    68.     for(int s=1; s<=k; s++)  
    69.     {  
    70.         n /= 2;  
    71.         for(int t=1; t<=n; t++)  
    72.         {  
    73.             for(int i=m+1; i<=2*m; i++)//控制行  
    74.             {  
    75.                 for(int j=m+1; j<=2*m; j++)//控制列  
    76.                 {  
    77.                     a[i][j+(t-1)*m*2] = a[i-m][j+(t-1)*m*2-m];//右下角等于左上角的值  
    78.                     a[i][j+(t-1)*m*2-m] = a[i-m][j+(t-1)*m*2];//左下角等于右上角的值  
    79.                 }  
    80.                   
    81.             }  
    82.         }  
    83.         m *= 2;  
    84.     }  
    85. }  
    程序运行结果:

    展开全文
  • 循环赛排序

    2016-08-22 15:25:00
    循环赛排序 小组搞个台球比赛,什么都写代码实现真是个好习惯: var players = [ 'Lion', 'Miles', 'Mark', 'Purk', 'Kevin', 'Collen', 'Victor' ]; var playlist = []; for (var i = 0; i < players....

    循环赛排序

    小组搞个台球比赛,什么都写代码实现真是个好习惯:

    var players = [
        'Lion',
        'Miles',
        'Mark',
        'Purk',
        'Kevin',
        'Collen',
        'Victor'
    ];
    
    var playlist = [];
    
    for (var i = 0; i < players.length; i++) {
        for (var j = i + 1; j < players.length; j++) {
            playlist.push(players[i] + '  --  ' + players[j])
        }
    }
    
    playlist.sort(function() {
        return Math.random() > 0.5? - 1: 1;
    });
    
    for (var i =0; i<playlist.length; i++) {
        console.log(i+'. '+playlist[i]);
    };
    
    
    0. Kevin  --  Collen
    1. Kevin  --  Victor
    2. Miles  --  Victor
    3. Mark  --  Purk
    4. Lion  --  Mark
    5. Lion  --  Victor
    6. Collen  --  Victor
    7. Mark  --  Victor
    8. Miles  --  Collen
    9. Miles  --  Mark
    10. Mark  --  Collen
    11. Lion  --  Kevin
    12. Purk  --  Victor
    13. Miles  --  Kevin
    14. Purk  --  Kevin
    15. Purk  --  Collen
    16. Miles  --  Purk
    17. Mark  --  Kevin
    18. Lion  --  Collen
    19. Lion  --  Purk
    20. Lion  --  Miles
    [Finished in 0.2s]

    转载于:https://www.cnblogs.com/wancy86/p/5795761.html

    展开全文
  • 循环赛算法

    千次阅读 2010-11-20 14:59:00
    单循环制 参加比赛的各队之间均相互比赛一次,即为单循环赛。 (1)单循环赛的比赛场数计算公式:场数=队数(队数-1)/2 (2)单循环赛的比数轮数计算方法:参赛队为奇数时,比赛轮数等于队数;参赛队为双数时,比赛轮数等于...
    单循环制 参加比赛的各队之间均相互比赛一次,即为单循环赛。 
    (1)单循环赛的比赛场数计算公式:场数=队数(队数-1)/2 
    (2)单循环赛的比数轮数计算方法:参赛队为奇数时,比赛轮数等于队数;参赛队为双数时,比赛轮数等于队数减1。 
    (3)单循环赛的编排方法: 
    ①一般编排方法。采用“逆时针轮转方法”进行编排,先以阿拉伯数字作为代号,代替队名进行编排。把队数按U型走向分成均等两边,如遇单数队,最后一位数字补为O成为偶数。第一轮只要在U形相对队数之间划横线,即为第一轮比赛秩序。第二轮开始固定左上角1数字,其余数字均按逆时针方向移动一个位置,即为第二轮比赛秩序,以后各轮比赛秩序以此类推。遇O队数即轮空队。 
    例如,有7个队参加比赛,比赛秩序编排如下所示: 
    第一轮 第二轮 第三轮 第四轮 第五轮 第六轮 第七轮 
    1—0 1—7 1—6 1—5 1—4 1—3 1—2 
    2—7 0—6 7—5 6—4 5—3 4—2 3—0 
    3—6 2—5 0—4 7—3 6—2 5—0 4—7 
    4—5 3—4 2—3 0—2 7—0 6—7 5—6 
    采用逆时针轮转法编排的优点,是参赛各队比赛进度一致,编排方法简单,易操作、检查。但当单数队在5个队以上时,抽签为倒数的第二数字队则在第四轮开始每轮均同上轮轮空队进行比赛,如上述的数字6代表的队。由此产生了球类比赛中的不公平竞争现象。为了解决这一问题,目前的比赛大多采用“贝格尔编排方法”。 

    编排方法(“贝格尔”编排法)
    从1985年起,世界性排球比赛多采用“贝格”“编排法。其优点是单数队参加时可避免第二轮的轮空队从第四轮起每场都与前一轮的轮空队比赛的不合理现象。
    采用“贝格尔”编排法,编排时如果参赛队为双数时,把参赛队数分一半(参赛队为单数时,最后以“0”表示形成双数),前一半由1号开始,自上而下写在左边;后一半的数自上而下写在右边,然后用横线把相对的号数连接起来。这即是第一轮的比赛。
    第二轮将第一轮右上角的编号(“0”或最大的一个代号数)左角上,第三轮又移到右角上,以此类推。即单数轮次时“0”或最大的一个代号在右上角,双数轮次时则在左上角。如下表示(表1):
    表1 5个队比赛的编排方法

    第一轮 第二轮 第三轮 第四轮 第五轮 第六轮 第七轮
    1-0 0-5 2-0 0-6 3-0 0-7 4-0
    2-7 6-4 3-1 7-5 4-2 1-6 5-3
    3-6 7-3 4-7 1-4 5-1 2-5 6-2
    4-5 1-2 5-6 2-3 6-7 3-4 7-1
    无论比赛队是单数还是双数,最后一轮时,必定是“0”或最大的一个代号在右上角,“1”在右下角。
    根据参赛队的除数不同,“1”朝逆时针方向移动一个位置时,应按规定的间隔数移动(见表2)“0”或最大 代号数应先于“1”移动位置。
    表2 间隔移动
    参赛队数 间隔数
    4队以下 0
    5~6队 1
    7~8队 2
    9~10队 3
    11~12队 4


    “1”进行间隔移动时,凡遇到“0”或最大代号数时应先越过,不作间隔计算。
    一般国内比赛,各队以上届比赛所取得的名次数作为代号,如第1名为“1”,第2名“2”,依此类推。世界性比赛大都采用东道主代号为“1”,上届第1名为“2”,依此类推。有的比赛也采用抽签方法确定代号。
    编排守比赛秩序表后,在抽签之前,应确定是在轮次线的左边队的场地进行比赛,还是在轮次线的右边队的场地进行比赛。

    展开全文
  • 网球循环赛日程表

    千次阅读 2020-03-28 14:45:01
    有n个运动员要进行网球循环赛。设计一个满足以下要求的比赛日程表: 1):每个选手必须与其他n-1个选手各赛一次; 2):每个选手每天只能赛一次; 3):当n是偶数时,循环赛进行n-1天。当n是奇数时,循环赛进行n天。...

    问题描述

    有n个运动员要进行网球循环赛。设计一个满足以下要求的比赛日程表:
    1):每个选手必须与其他n-1个选手各赛一次;
    2):每个选手每天只能赛一次;
    3):当n是偶数时,循环赛进行n-1天。当n是奇数时,循环赛进行n天。

    算法分析

    (1)对于2^k规模的问题

    对于这样的问题,我们可以直接从最小规模开始推导:
    定义一张赛程表,第一列表示选手标号,后面的第i列表示第i天的选手赛程

    • k=2
      在这里插入图片描述
    • k=4
      在这里插入图片描述
    • k=8
      在这里插入图片描述

    • 很容易发现,这个过程其实就是反复执行了一个处理左下角,处理右上角,处理右下角的操作
    • 左下角的值等于当前位置的区域加上当前规模k/2
    • 右上角的值等于左下角的值
    • 右下角的值等于当前区域的值
    • 当规模为1时,当前值为1
    • 我们可以设计一个递归算法来处理:
    void copy(int n)
    {//复制
    	int m = n/2;
    	for(int i=1; i<=m; i++){
    		for(int j=1; j<=m; j++){
    			a[i][j+m] = a[i][j] + m;//左下角
    			a[i+m][j] = a[i][j+m];//右上角
    			a[i+m][j+m] = a[i][j];//右下角
    		}
    	}
    }
    
    void schedule (int n){
    	if(n == 1){
    		a[1][1] = 1;
    		return;
    	}
    	schedule(n/2);
    	copy(n);
    }
    

    考虑一般值

    以上的算法可以很好地解决2^k规模的数据,但是对于更为一般的情况我们还需要做一些提升,策略如下

    • 当n=2k+1为奇数时,我们增加一个虚拟选手用来轮空
    • 当n=2k为偶数是,我们仍然可以用以上的算法来仅仅复制,因为整个赛程表是对称的可以直接进行复制处理
    • 递归处理时n/2如果为偶数,继续进行递归处理
    • 当n/2为奇数时,我们要进行修正

    奇数时的修正

    • 对于一个选手a[i],如果他匹配的对手大于当前的规模m,说明它匹配的是一个虚拟选手
    • 我们将a[i]的虚拟选手修改为m+i
    • 同时修改a[m+i]号选手的对手为(b[i]+m)%n,以防止重复
    • 填充右上角之前,用一个数组b来记录当前a[i]的对手为a[m+i],a[i+m]的对手为a[i],在填充右上角时j-1相当于m,a[i][m+j]=b[i+j-1]
    #include <iostream>
    using namespace std;
    int a[1001][1001];
    int b[1001];
    void copy1 (int n){//复制
    	int m = n/2;
    	for(int i=1; i<=m; i++){
    		for(int j=1; j<=m; j++){
    			a[i][j+m] = a[i][j] + m;//左下角
    			a[i+m][j] = a[i][j+m];//右上角
    			a[i+m][j+m] = a[i][j];//右下角
    		}
    	}
    }
    void copy2(int n){//奇数处理
    	int m = n/2;
    	for(int i=1; i<=m; i++){
            //按照递增构造赛程
    		b[i] = m+i;
    		b[m+i] = b[i];
    	}
    	//
    	for(int i=1; i<=m; i++){
    		for(int j=1; j<=m+1; j++){
    			if(a[i][j]>m){//当a[i][j]>m的时候,认为这名选手的对手是虚拟选手
    				a[i][j]=b[i];//由于a[i][j]轮空,我们直接让a[i][j]选手与m+i比赛保证与之前的构造一致
    				a[m+i][j]=(b[i]+m)%n;//同时修改a[m+i]号选手的对手为(b[i]+m)%n,以防止重复
    			}
    			else{
    			    //否则a[m+i]的对手构递增造为a[i][j]+m
    				a[m+i][j]=a[i][j]+m;
    			}
    		}
    		for(int j=2;j<=m;j++){
    			a[i][m+j]=b[i+j-1];//右上角,此处的j-1相当于m
    			a[b[i+j-1]][m+j]=i;//左下角,对称填充
    		}
    	}
    }
    void copy3(int n){
    	if(n/2>1 && (n/2)%2!=0)
    	copy2(n);
    	else
    	copy1(n);
    }
    void schedule (int n){
    	if(n == 1){
    		a[1][1] = 1;
    		return;
    	}
    	if(n%2!=0) n++;
    	schedule(n/2);
    	copy3(n);
    }
    void output (int n){
    	int m=n;
    	bool flag=true;
    	if(n%2!=0){
    		flag=false;
    		m++;
    	}
    	for(int i=1; i<=n; i++){
    		for(int j=1; j<=m; j++){
    			if(flag==false && a[i][j]==m)
    			cout<<'x'<<" ";
    			else
    			cout<<a[i][j]<<" ";
    		}
    		cout<<endl;
    	}
    }
    int main(){
    	int n;
    	cin >> n;
    	schedule(n);
    	output(n);
    	return 0;
    }
    
    

    在这里插入图片描述

    展开全文
  • 循环赛日程表

    2017-10-10 19:55:40
    问题:设有 n=2k个选手要进行网球循环赛。现要设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他 n-1个选手各赛一次; (2)每个选手一天只能赛一次; (3)循环赛一共进行 n-1天。 分析: 可以将...
  • 小组赛,每个小组有5支队伍,互相之间打单循环赛,胜一场3分,平一场1分,输一场不得分,小组前三名出线。平分抽签。问一个队最少拿()分就有理论上的出线希望 解析 单循环赛: 单循环赛,是所有参加比赛的队均能相遇...
  • 循环比赛排名模型

    千次阅读 2019-09-26 20:48:00
    问题如下,循环比赛排名,各队伍两两交锋,假设每场比赛只记胜负,不记得分,在比赛结束之后如何排名? 双向联通竞赛图一定能够排名 如题 如图 初始每个队伍记为1 经过一次计算之后,得到的序列为 2 2...
  • 本人为在体育课上排多人循环赛的赛程写的一个小程序,java写的,有界面。
  • 循环比赛队伍排列组合问题

    千次阅读 2019-05-12 20:47:32
    2019/05/12 引言 昨天看比赛的时候,看到...小组赛共计6支队伍,按照双循环赛事,共计比赛5天,每天打6场,每个队每天打2场,第3天的上半轮(即前三场)完成第一轮循环赛,共计30场比赛。 转化为数学形式: 小组赛...
  • 功能说明:足球赛某小组有n个球队,球队两两之间进行循环赛,共有n*(n-1)/2场比赛,每场比赛对应一对得分比,请按示例格式完成以下要求。 (1)输入球队数n(假设n<10),并输入n*(n-1)个比赛得分; (2)计算并...
  • 循环赛赛程安排---递归思想

    千次阅读 2014-03-13 17:23:11
    今天上午准备学习一道算法,拿到一本《计算机算法设计、分析与实现》书,翻开一道循环赛赛程安排的题目。要求大致是这样的: 要求有n=2^k名网球运动员进行轮流赛,每个人都要与其他n-1名队员打一场比赛; 比赛在n-...
  • 循环赛日程编排c代码

    千次阅读 2013-10-26 13:12:11
    #include int m,s,n; int i,j; int a[100][100]; int sf(int n) { if(n%2!=0) printf("输入参数不合法!"); else if(n==2) { a[0][0]=1; a[0][1]=2; a[1][0]=2; ... {
  • 一、循环赛的种类与特点(一)循环赛的种类循环赛又称循环法。是指参赛队(或个人,下同)之间,都要互相轮流比赛,最后按照各参赛队在全部比赛中的胜负场数、得分多少排定名次的比赛方法。它在对抗性项目比赛中经常被...
  • CF小组训练 Holiday 30

    2021-02-19 23:55:12
    小组训练,链接无法访问,具体题目地址可以直接搜索题目标题 题目大意 求(a xor x)+ (b xor x) 的最小值 解题思路 思维题。 以二进制考虑a,b: 当a=1,b=1时,为了取最小值0,当x=1时上述运算结果为0 当a=1,b=0时...
  • %求特征根和特征向量 [V,D]=eig(A) matlab程序: A1=[0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1; 1,0,1,1,0,1,1,1,0,1,0,0,1,1,1,1; 0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1; 1,0,1,0,1,0,0,1,1,0,1,1,1,0,1,1;...0,0,0,...
  • 已知第一排
  • 选题9、世界杯小组赛分组题目描述:世界杯是每四年的一个热门话题,...参考循环赛)。提示:1.可以用链表指针或者结构体数组;2.随机数;3.也许你能做到我没有想到的。</p>
  • 传送门 显然是爆搜+O(玄学)优化。 剪枝1:如果全取3或全取0仍不可行退出。 剪枝2:如果还有n个队没有比过,分数差n*3-1,退出。 然后就过了呀。#include #include #include using namespace std;...
  • 规范管理办法要求各级业余联赛原则上要以循环赛制为主,淘汰赛制为辅,具体为:中冠联赛以分阶段的主客场小组循环赛、大组循环赛和排位赛为主;省市级业余联赛条件成熟,应以主客场循环赛制为主;地市级业余联赛应以...
  • YTUOJ-世界杯小组赛

    千次阅读 2015-06-29 23:53:40
    世界杯32支参赛队分为八个小组,每个小组分别有四支球队进行比赛,每支球队都必须和其他三支球队进行且只进行一场比赛,每组4个队循环比赛,共打6场(a1-a2;a1-a3;a1-a4;a2-a3;a2-a4;a3-a4),每场比赛90分钟,胜平负分别...
  • 备注:单循环赛是指所有参加比赛的队两两之间都比赛一次,最后按各队在全部比赛中的积分,得失分率排列名次。 解决方案 设:四个小队分别为A,B,C,D。 若:要出线2队 则:使A,B,C,D 两两比赛全为平局 则:此时A,B,C,...
  • 2013 年 5 月 30 日 by  sciencefans 这次比赛我又有了一些进步,懂了一些小小...5.动态规划还是少用递归吧,要好好用循环。。。现在的递归代码水平简直就是一坨shit啊。。。 6.二分查找的临界值。。。弱点。
  • 可以添加一些赛程安排之类的增加代码量 英格兰、法国、德国、意大利、西班牙、荷兰、葡萄牙、克罗地亚、土耳其、俄罗斯、瑞典、捷克、塞尔维亚、加纳、科特迪瓦、突尼斯、尼日利亚、喀麦隆...(参考循环赛) 急救!!!
  • 2615: AB编程题--世界杯小组赛 时间限制:1 Sec内存限制:128 MB 提交:100解决:35 题目描述 注:本题目自由设计,但必须使用类进行代码设计。 世界杯32支参赛队分为八个小组,每个小组分别有四支球队...
  • 数学建模 小组赛第一题 航空公司 选取指标是根据RFM模型定义的客户粘性、忠诚度和购买力加上终身价值和潜在价值选出来了五个指标LRFMC。L会员注册时长代表终身价值,R最后一次购买商品到现在的时间表达粘性,F观测期...
  • 其实关于欧冠小组赛出线情况的一些问题,比如理论上小组第二的最低积分(最低出线的分数)、小组第三的最高积分(最悲催的出局分数)、最低的小组第一积分等等,这些问题小编之前自己用笔也算过,这次趁着学习Python...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,988
精华内容 1,195
关键字:

小组循环赛