循环赛日程表分治算法(c语言)

循环赛日程表分治算法(c语言)
循环赛日程表分治算法(c语言)

/*

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

* 每个选手必须与其他n-1个选手各赛一次;

* 每个选手一天只能参赛一次;

* 循环赛在n-1天内结束。

* 数组a[i][j]第i个选手在第j天所遇到的选手。 */

#include

#include

void gametable(int k)

{

int a[100][100];

int n,temp,i,j,p,t;

n=2;//k=0两个参赛选手日程可以直接求得

a[1][1]=1;a[1][2]=2;

a[2][1]=2;a[2][2]=1;

for(t=1;t

{

temp=n;n=n*2;//填左下角元素

for(i=temp+1;i<=n;i++)

for(j=1;j<=temp;j++)

a[i][j]=a[i-temp][j]+temp;//左下角和左上角元素的对应关系

for(i=1;i<=temp;i++)//将左下角元素抄到右上角

for(j=temp+1;j<=n;j++)

a[i][j]=a[i+temp][(j+temp)%n];

for(i=temp+1;i<=n;i++)//将左上角元素抄到右下角

for(j=temp+1;j<=n;j++)

a[i][j]=a[i-temp][j-temp];

}

printf("参赛人数为:%d\n(第i行第j列表示和第i个选手在第j天比赛的选手序号)\n",n);

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

{

printf("%d ",a[i][j]);

if(j==n)

printf("\n");

}

}

void main()

{

int k;

printf("比赛选手个数为n(n=2^k),请输入参数K(K>0):\n");

scanf("%d",&k);

if(k!=0)

gametable(k);

}

c语言程序代码

1.要求在屏幕上输出下一行信息。 This is a c program. 程序: #include int main() { printf(“this is a c program.\n”); return 0; } 2.求两个整数之和。 程序: #include int main() { int a,b,sum; a=122; b=234; sum=a+b; printf(“sum is %d\n”,sum); return 0; } 3.求两个整数之间的较大者。

#include int main() { int max(int x,int y); int a,b,c; scanf("%d,%d",&a,&b); c=max(a,b); printf("max=%d\n",c); return 0; } int max(int x,int y) { int z; if(x>y)z=x; else z=y; return(z); } 4.有人用温度计测量出华氏发表示的温度(如69°F),今要求把 她转换成以摄氏法表示的温度(如20℃)。 公式:c=5(f-32)/9. 其中f代表华氏温度,c代表摄氏温度。

#include int main() { float f,c; f=64.0; c=(5.0/9)*(f-32); printf("f=%f\nc=%f\n",f,c); return 0; } 5.计算存款利息。有1000元,想存一年。有一下三种方法可选: (1)活期:年利率为r1;(2)一年定期:年利率为r2;(3)存两次半年定期:年利率为r3。分别计算一年后按三种方法所得到的本息和。 程序: #include int main() { float p0=1000,r1=0.0036,r2=0.0225,r3=0.0198,p1,p2,p3; p1=p0*(1+r1); p2=p0*(1+r2);

循环赛的方法与编排

循环赛的方法与编排 一、循环赛的种类与特点 (一)循环赛的种类 循环赛又称循环法。是指参赛队(或个人,下同)之间,都要互相轮流比赛,最后按照各参赛队在全部比赛中的胜负场数、得分多少排定名次的比赛方法。它在对抗性项目比赛中经常被采用。循环赛包括单循环、双循环或分组循环三种。单循环是所有参赛队(人)相互轮赛一次;双循环是所有参赛队(人)相互轮赛二次;分组循环是参赛队(人)较多时,采用种子法,把强队(人)分散在各组,先进行小组单循环赛,再根据小组名次来组织第二阶段的比赛。主办单位可根据参赛队多少和比赛期限的长短以及项目特点而灵活选用。一般情况下,单循环宜在参赛队不太多,比赛时间与场地又比较充裕时采用;分组循环大多是在参赛队数多,比赛时间又不能过长,并尽量为参赛队提供比赛机会,使比赛能较合理地排定名次时采用。 (二)循环赛的特点 采用循环法进行比赛,总的优点是参赛队机会均等,实战和互相观摩学习的机会多,能准确地反映出参赛队之间真正的技术水平的高低,客观地排定参赛队的名次,比赛结果的偶然性和机遇性小。上述优点正是淘汰赛的主要缺点,但循环赛自身也存在有某些不足与矛盾,应引起组织者的重视。 1.比赛总的期限长,占用场地和时间多,当参赛队(人)多时,直接采用大循环赛有一定困难,应用范围上有一定的局限性。 2.如何合理地安排比赛的顺序,避免在比赛时间、间隙、地点、场次和比赛条件等方面出现的不均衡现象。 3.当比赛结果有两个或两个以上队的胜负场数相同,得失分相等时,如何根据不同项目的特点,科学地解决好最后名次的排定。 二、循环赛的轮数与场数计算 (一)循环赛的轮数 每个参赛队赛毕一场(轮空队除外),称为一轮结束。计算循环赛的轮数,目的在于计划整个比赛所需用的时间或期限,是比赛日程安排的主要依据。其计算方法:Y=轮次数,N=参赛队数 如果参赛队为偶数Y=N-1 即轮次数=参赛队数-1 如果参赛队为奇数,则:比赛轮数=参赛队数。 注:双循环赛的轮数是单循环赛轮数的加倍。 (二)循环赛的场数 循环赛的场数是指参赛队之间互相轮流比赛全部结束的总场数。计算循环赛的比赛总场数,目的在于计划安排人力、物力、比赛日程与场地。其计算方法如下: X=N×(N-1)÷2 X为比赛场数,N为参赛队数。 单循环比赛场数=参赛队数×(参赛队数-1)÷2 双循环比赛的总场数=参赛队数×(参赛队数-1) 三、循环比赛顺序的编排方法与注意事项 (一)单循环比赛顺序的编排方法 1.轮次表的安排方法

网球循环赛日程表

一、问题表述: 设有n个运动员要进行网球循环赛。设计一个满足以下要 求的比赛日程表, (1)每个选手必须与其他n-1个选手各赛一次; (2) 每个选手一天只能赛一次; (3) 当n是偶数时,循环赛进行n-1天,当n是奇数时,循环 赛进行n天 二、分析问题 题目是要n名运动员进行循环比赛。当n为偶数时,正好每天都可以两两一组,与其余的n-1个选手比赛,只需n-1天; 而当n为奇数,每天将有一个选手轮空,比赛将持续n天。 可以采用的算法如下: 1.算法一:使用分治法 当n为偶数时,可以讲问题分为两个部分n/2; 然后继续划分, 知道最后剩余两名选手单独比赛。当n为奇数时,增设一个虚拟 选手,运动员为n+1个,将问题转化为是偶数的情形。当选手与 虚拟选手比赛时,表示轮空,因此只需要关注n为偶数的情形。 a)当n/2为偶数时,与n = 2^k情形类此。 b)当n/2为奇数时,增设一个虚拟的选手,递归返回的将有轮 空的选手,可以讲在前面n/2轮比赛的选手与后面n/2轮空的 选手进行比赛。 2.算法二:利用边是奇数的正多边形。 特点:以多边形中的任意一个顶点画对称轴,其余偶数对顶点相 互对称。 N名选手编号为1~n,将其画成一个正多边形。 a)所以当n为奇数时,第一天1号休息,其余以一号为对称轴, 两两对称打比赛,第二天开始一次轮流休息,其余一休息的 那个人编号为对称轴,两两比赛。这样比赛可进行n天。如 图:

b) 当n 为偶数时,取出编号最大的,其他的组成一个正多边形,n 号一次顺序与1,2,。。。n-1号选手比赛,其他与a )相同。如图所示:(图中是从0开始编号)

第一节 循环赛的方法与编排

第一节循环赛的方法与编排 一、循环赛的种类与特点 (一)循环赛的种类 1、概念循环赛又称循环法。指参赛队(人)之间,都相互轮流比赛,最后按照各参赛队在全部比赛中的胜负场数、得分多少排定名次的比赛方法。 2、分类循环赛包括单循环、双循环和分组循环三种。 单循环是所有参赛队(人)相互轮赛一次;一般在参赛队人不太多,场地和时间比较充裕时采用。 双循环是所有参赛队(人)相互轮赛二次;一般在参赛队人不多,场地和时间比较充裕时采用。 分组循环是参赛队(人)较多时,采用种子法,把强队(人)分散在各组,先进行小组循环,再根据小组名次组织第二阶段的比赛。一般在参赛队人多,场地和时间较紧时采用。 (二)循环赛的优缺点 优点:参赛队机会均等,实战和相互观摩学习的机会多,能准确反映出参赛队之间真正的技术水平的高低,客观地排定参赛队的名次,比赛结果的偶然性和机遇小。 缺点: 1、比赛总的期限长,站用场地和时间多,当参赛队人多时,直接采用大循环有一定的困难,应用范围具有一定的局限性。 2、如何合理安排比赛的顺序,避免在比赛时间、间隙、地点、场次和比赛条件等方面出现不均衡现象。 3、当比赛结果有两个或两个以上队人的胜负场数相同,得失分相等时,如何根据不同项目的特点,科学地解决好最后的名次排定。 二、循环赛的轮数与场数计算 (一)循环赛的轮数 每个参赛队赛完一场(轮空队除外),称为一轮结束。计算循环赛的轮数的目的在于计划整个比赛所需要的时间和期限,是比赛日程安排的主要依据。 计算方法: 1、单循环 当N=2n时,Y=N-1 当N=2n-1时,Y=N (其中Y=轮次数,N=参赛对数) 2、双循环和多循环为单循环的倍数。 (二)循环赛的场数 循环赛的场数是指参赛队人之间相互轮流比赛全部结束

C语言程序设计 入门源代码代码集合

#include <> void print_star(void) { printf("*****************\n"); } void print_welcome(void) { printf("C language,welcome!\n"); } void main() { print_star(); print_welcome(); print_star(); getchar(); } 演示2 #include "" int sum(int i,int j) { return(i + j); } void main() { int n1,n2; printf("input 2 numbers:\n"); scanf("%d%d",&n1,&n2); printf("the sum = %d\n",sum(n1,n2)); getchar(); } 演示3 #include "" int maxnum(int,int,int); main() { int a,b,c; printf("Please enter 3 numbers:\n"); scanf("%d,%d,%d",&a,&b,&c); printf("Maxnum is %d\n",maxnum(a,b,c)); return 0;

} int maxnum(int x,int y,int z) { int max=x; if(y>max) max = y; if(z>max) max = z; return max; } 演示4 #include <> int s1(int n) { int j,s; s=0; for(j=1;j<=n;j++) s=s+j; return s; } int sum(int n) { int i,s=0; for(i=1;i<=n;i++) s=s+s1(i); return s; } void main() { int n; printf("n:"); scanf("%d",&n); printf("s=%d\n",sum(n)); } 演示5 #include <>

循环赛日程表问题研究

学年论文 题目循环赛日程表问题研究 学生 指导教师 年级2009级 专业软件工程 系别软件工程 学院计算机科学与信息工程学院 哈尔滨师范大学 2012年6月 论文提要 本文采用分治算法来解决循环赛日程表的安排问题。通过对问题的详细分析,列出1到10个选手的比赛日程表,找出两条规则,作为算法实现的依据,而后采用c语言实现算

法,通过测试分析,程序运行结果正确,运行效率较高。同时也介绍了循环赛日程表问题的另一种解法多边形解法,这种方法另辟蹊径,巧妙地解决了循环赛日程表问题,运行效率较高。 循环赛日程表问题研究 摘要:本文采用分治算法来解决循环赛日程表的安排问题。根据算法的设计结果,采

用c 语言实现算法,通过测试分析,程序运行结果正确,运行效率较高。同时也介绍了循环赛日程表问题的另一种解法,这种方法另辟蹊径,想法独特,运行效率较高。 关键词:循环赛日程表问题;分治法 一、题目描述 设有n 个运动员要进行网球循环赛。设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次; (2)每个选手一天只能赛一次; (3)当n 是偶数时,循环赛进行n-1天。当n 是奇数时,循环赛进行n 天。 二、问题分析 循环赛日程表可以采用分治法实现,把一个表格分成4个小表格来处理,每个小表格都是一样的处理方法,只是参数不同。分析过程具体如下: 1、n=1 (表2-1) 2.、n=2 (表2-2) 3、n=3 (1) 添加一个虚拟选手4#,构成n+1=4 (2) 4/2=2,分两组,每组各自安排(1 2),(3 4) (3) 每组跟另一组分别比赛(拷贝)这是四个人比赛的 (表2-3) 4人赛程 (4) 把虚选手置为0 (表2-4)3人赛程 1 1 2 2 1 1 2 3 4 2 1 4 3 3 4 1 2 4 3 2 1

C语言程序设计-入门源代码代码集合

演示1 #include void print_star(void) { printf("*****************\n"); } void print_welcome(void) { printf("C language,welcome!\n"); } void main() { print_star(); print_welcome(); print_star(); getchar(); } 演示2 #include "stdio.h" int sum(int i,int j) { return(i + j); } void main() { int n1,n2; printf("input 2 numbers:\n"); scanf("%d%d",&n1,&n2); printf("the sum = %d\n",sum(n1,n2)); getchar(); } 演示3 #include "stdio.h" int maxnum(int,int,int); main() { int a,b,c; printf("Please enter 3 numbers:\n"); scanf("%d,%d,%d",&a,&b,&c); printf("Maxnum is %d\n",maxnum(a,b,c));

return 0; } int maxnum(int x,int y,int z) { int max=x; if(y>max) max = y; if(z>max) max = z; return max; } 演示4 #include int s1(int n) { int j,s; s=0; for(j=1;j<=n;j++) s=s+j; return s; } int sum(int n) { int i,s=0; for(i=1;i<=n;i++) s=s+s1(i); return s; } void main() { int n; printf("n:"); scanf("%d",&n); printf("s=%d\n",sum(n)); } 演示5

(完整word版)分治法循环赛日程表实验报告

西北农林科技大学信息工程学院《算法分析与设计》综合训练实习报告 题目:分治法循环赛日程表 学号 姓名 专业班级 指导教师 实践日期2011年5月16日-5月20日

目录 一、综合训练目的与要求 (1) 二、综合训练任务描述 (1) 三、算法设计 (1) 四、详细设计及说明 (3) 五、调试与测试 (4) 六、实习日志 (6) 七、实习总结 (6) 八、附录:核心代码清单 (6)

一、综合训练目的与要求 本综合训练是软件工程专业重要的实践性环节之一,是在学生学习完《算法分析》课程后进行的综合练习。本课综合训练的目的和任务: (1)巩固和加深学生对算法分析课程基本知识的理解和掌握; (2)培养利用算法知识解决实际问题的能力; (3)掌握利用程序设计语言进行算法程序的开发、调试、测试的能力; (4)掌握书写算法设计说明文档的能力; (5)提高综合运用算法、程序设计语言、数据结构知识的能力。 二、综合训练任务描述 假设有n=2k 个运动员要进行网球循环赛。设计一个满足一下要求的比赛日程表:(1)每个选手必须与其他n-1个选手各赛一次 (2)每个选手一天只能赛一次 (3)循环赛一共进行n-1天 利用Java语言开发一个界面,输入运动员的个数,输出比赛日程表。对于输入运动员数目不满足n=2k时,弹出信息提示用户。 三、算法设计 (1) 文字描述 假设n位选手顺序编号为1,2,3……n,比赛的日程表是一个n行n-1列的表格。第i行j列表示第i号选手在第j天的比赛对手,根据分治法,要求n个选手的比赛日程,只要知道其中一半的比赛日程,所以使用递归最终可以分到计算两位选手的比赛日程,然后逐级合并,得出结果。 (2) 框图

一些比较简c语言程序源代码

/**返回的long型的最大值是startLongValue+count-1(产生一个随机数) * param needCount * param count * param startLongValue * return */ public static List randomNoRepeatLongArray(int needCount,int count,long startLongValue){ //这种情况会出现无限循环的 if(needCount>count) return null; Random random = new Random(); int[] ints = new int[count]; for(int i=0;i list = new ArrayList(); while(list.size() #include #include

用C++编写循环赛日程表

循环赛日程表 问题描述:设有n位选手参加网球循环赛,n=2^k,循环赛共进行n-1天,每位选手要与其他n-1位选手比赛一场,且每位选手每天比赛一场,不能轮空,按一下要求为比赛安排日程, (1)每位选手必须与其他n-1格选手格赛一场; (2)每个选手每天只能赛一场; (3)循环赛一共进行n-1天; #include int a[50][50]; void table (int x,int k) //此函数为从x号球员起的共2的k次方名球员的安排日程表 { int i,j,y=1; if(k==1)//只有两名球员 { a[x][0]=x; a[x][1]=x+1; a[x+1][0]=x+1; a[x+1][1]=x; } else { for(i=1;i<=k-1;i++) {y=y*2;} table(x,k-1); table(x+y,k-1); for(i=x;i

int n=1; cout<<"请输入k值"<>k; for(i=1;i<=k;i++) {n=n*2;} cout<<"参赛人数"<<" "<

C语言程序设计(医院信息管理系统)附源代码

专业设计报告 课程名称: C 语言程序设计 课题名称:医院信息管理系统 专业班别: 12本计算机科学与技术二班 姓名: 学号: 指导教师: 设计日期: 2012-5-25

教师评语:

成绩评定: 指导教师签名: 日期: 2012 年月日 课程设计题目医院信息管理程序 作者姓名: 同组成员: 摘要利用结构体存储每个病人的信息和每种药品的信息,并使用链表存储全部病人的信息;能完成对医院内所有病人信息的注册、查询、删除和修改等操作,同时又能对药房内库存的药品进行查询;可以将链表中的病人信息保存在文件中,并且可以对文件中的病人信息进行读取与显示 1.专业设计目的

1、掌握链表的操作,包括链表节点的创建、释放还有链表的遍历 2、掌握对二进制文件的创建、增添等基本操作。 3、熟悉C语言函数的使用方法,学会模块化处理问题以及多个源文件的处理方式 2.设计基本要求( 1、使用结构体来存储病人的信息,结构体中包括病的id号码、姓名、病历以及消费信息,并用链表将所有病人信息整合。 2、用文件来存储链表的信息以便下次再使用该程序时载入病人信息 3、能够实现病人信息的注册、病人信息的查询、病人消费统计、保存链表信息、载入链表信息、查询库存等几项功能。 4、要求用四个源文件、、、 5、系统完成后应实现类似下面所示界面

3、算法分析 1、数据结构 设计链表中的一个节点存储一个病人的信息,使用下面的结构体类型定义:struct patient{ char id[10]; char name[10]; char casehist[200]; int cost[3]; int transfusion;

算法分析实验报告--分治策略

分治策略 姓名:XXX 专业班级:XXX 学号:XXX 指导教师:XXX 完成日期:XXX

一、试验名称:分治策略 (1)写出源程序,并编译运行 (2)详细记录程序调试及运行结果 二、实验目的 (1)了解分治策略算法思想 (2)掌握快速排序、归并排序算法 (3)了解其他分治问题典型算法 三、实验内容 (1)编写一个简单的程序,实现归并排序。 (2)编写一段程序,实现快速排序。 (3)编写程序实现循环赛日程表。设有n=2k个运动员要进行网球循环赛。现 要设计一个满足以下要求的比赛日程表:(1)每个选手必须与其它n-1个选手各赛一次(2)每个选手一天只能赛一场(3)循环赛进行n-1天 四、算法思想分析 (1)编写一个简单的程序,实现归并排序。 将待排序元素分成大小大致相同的2个子集合,分别对2个子集合进行 排序,最终将排好序的子集合合并成为所要求的排好序的集合。 (2)编写一段程序,实现快速排序。 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有 数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数 据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据 变成有序序列。 (3)编写程序实现循环日赛表。 按分治策略,将所有的选手分为两组,n个选手的比赛日程表就可以通 过为n/2个选手设计的比赛日程表来决定。递归地用对选手进行分割, 直到只剩下2个选手时,比赛日程表的制定就变得很简单。这时只要让

这2个选手进行比赛就可以了。 五、算法源代码及用户程序 (1)编写一个简单的程序,实现归并排序。 #include #include<> #define MAX 10 using namespace std; void merge(int array[],int p,int q,int r) { int i,k; int begin1,end1,begin2,end2; int* temp = new int[r-p+1]; begin1 = p; end1 = q; begin2 = q+1; end2 = r; k = 0; while((begin1 <= end1)&&(begin2 <= end2)) { if(array[begin1] < array[begin2]) { temp[k] = array[begin1]; begin1++; } else { temp[k] = array[begin2]; begin2++; } k++; } while(begin1 <= end1) { temp[k++] = array[begin1++]; }

C语言程序设计医院信息管理系统附源代码样本

专业设计报告 课程名称: C 语言程序设计 课题名称: 医院信息管理系统 专业班别: 12本计算机科学与技术二班姓名: 学号: 指导教师: 设计日期: -5-25

教师评语: 成绩评定: 指导教师签名: 日期: 年月日 课程设计题目医院信息管理程序

作者姓名: 同组成员: 摘要利用结构体存储每个病人的信息和每种药品的信息, 并使用链表存储全部病人的信息; 能完成对医院内所有病人信息的注册、查询、删除和修改等操作, 同时又能对药房内库存的药品进行查询; 能够将链表中的病人信息保存在文件中, 而且能够对文件中的病人信息进行读取与显示1.专业设计目的 1、掌握链表的操作, 包括链表节点的创立、释放还有链表的遍历 2、掌握对二进制文件的创立、增添等基本操作。 3、熟悉C语言函数的使用方法, 学会模块化处理问题以及多个源文件的处理方式 2.设计基本要求( 1、使用结构体来存储病人的信息, 结构体中包括病的id号码、姓名、病历以及消费信息, 并用链表将所有病人信息整合。 2、用文件来存储链表的信息以便下次再使用该程序时载入病人信息 3、能够实现病人信息的注册、病人信息的查询、病人消费统计、保存链表信息、载入链表信息、查询库存等几项功能。 4、要求用四个源文件main.c、link.c、find.c、save_load.c 5、系统完成后应实现类似下面所示界面

3、算法分析 1、数据结构 设计链表中的一个节点存储一个病人的信息, 使用下面的结构体类型定义: struct patient{ char id[10]; char name[10]; char casehist[200]; int cost[3]; int transfusion; int surgery; struct patient *next; };

运动会c语言源程序代码

#include #include #include #include #define n 2 #define m 1 #define w 1 #define null 0 typedefstruct { intitemnum; int top; int range[5]; int mark[5]; }itemnode; typedefstruct { intschoolnum; int score; intmscore; intwscore; itemnode c[m+w]; }headnode; headnode h[n]; voidinputinformation() { inti,j,k,s; for(i=0;i

scanf("%d",&h[i].c[j].itemnum); printf("*****取前3名or前5名:"); scanf("%d",&h[i].c[j].top); printf("*****获得几个名次:"); scanf("%d",&k); for(s=0;s<5;s++) h[i].c[j].range[s]=0, h[i].c[j].mark[s]=0; for(s=0;s

c语言动画程序源码

C语言动画程序 #include #include #include #include #define pi 3.1415926535 double ca3mm1(double m1,double m2); double ca3fm1(double cosine,double sine); double ca5fm2(double a6m,double a5m,double a4m,double a4f,int shang); double ca6fm2(double a4m ,double a4f,double a5m , double a5f); char inbox(int x,int y,int x1,int y1); char buf(); main() { double m=3.0; double xo=100.0,yo=200.0,a1=30.0,t1=pi; double xc=xo+m*a1,yc=yo; double a2=8.0,a3,a4=25.0,a5=30.0,a6=20.0,a7=35.0; double t2,t3,t4,t5,t6,t7; double xo1=xo+m*150,yo1=yo; double xc1=xo1-m*a1,yc1=yo1; double i,j,k; double l1; double n=116.1,nt; initscreen(); setfillstyle(SOLID_FILL,DARKGRAY); bar(0,0,640,480); mybutton(10,10,"BEGIN",1,0); mybutton(500,10,"EXIT",1,0); line(0,69,640,69); mouseinit(); changemousecross(); setmousexy(320,20); mouseshow(); setmousearea(0,0,640,60); do{ if(inbox(10,10,70,26)&&button()==1) {mousehide(); mybutton(10,10,"BEGIN",0,0); mouseshow(); mousehold(); mousehide(); mybutton(10,10,"BEGIN",1,7); mouseshow(); break; }

单循环赛日程表

题目:循环赛日程表 设计一个满足一下要求的比赛日程表 (1)每个选手必须与其他n-1个选手各赛一次; (2)每个选手一天只能赛一次; (3)若才赛选手为偶数,循环赛一共进行n-1天;若参赛选手为奇数循环赛一共进行n天。主要思想:“贝格尔”编排法,其优点是单数队参加时可避免第二轮的轮空队从第四轮起每场都与前一轮的轮空队比赛的不合理现象。 方法如下: 所谓贝格尔编排法,第一轮开始的编排同传统方法一样,假设现在有7个队参加单循环,分别抽签成为1-7队,由于贝格尔编排法必须是双数队,所以再加一个0队,与0队比赛表示该队轮空,现在必须定下一个数为参照数,因此我们假设0为参照数(任意数都可以,一般取0或者最大数),第一轮的对阵形式如下: 1 – 0 2 – 7 3 – 6 4 – 5 这个大家都能看明白,这跟贝格尔编排法无关,第二轮则开始相关了。在第一轮中,0在右边,现在我们要在第二轮让它换成左边,第三轮又让它换回右边,反反复复,到最后一轮即第七轮时,它还是在右边。我们把0安排好后,再把第一轮右下角的5提到右上角来,因此第二轮的第一场比赛就变成: 0 – 5 然后我们还要回到第一轮的八个数字来,我们假设它是一个环,无论是顺时针还是逆时针,它们的位置是相对固定的(除了它们与0的位置有时候会改变外,因为0的位置是先定好的),比如按照顺时针方向看,5的前面是6,后面是4,因此,第二轮我们还是安排5的前面是6,后面是4,0我们假设它不存在,于是第二轮的第一、二场比赛就是: 0 – 5 6 – 4 那其他怎么办呢,照旧轮呗,就像排球的轮转一样,于是第二轮就是 0 – 5 6 – 4 7 – 3 1 – 2 其他依次类推。 无论比赛队是单数还是双数,最后一轮时,必定是“0”或最大的一个代号在右上角,“1”在右下角。 根据参赛队的个数不同,应按规定的间隔数移动(见表)。 间隔移动

分支算法循环赛日程表课程设计

摘要 分治算法在实际中有广泛的应用,例如,对于n个元素的排序问题,当n = 1 时,不需任何计算;当n = 2 时,只要做一次比较即可排好序;当n = 3时只要做两次比较即可……而当n较大时,问题就不容易那么处理了。要想直接解决一个较大的问题,有时是相当困难的。分治算法的基本思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。如果原问题可分割成k个子问题,1 < k < n+1,且这些子问题都可解,并可利用这些子问题的解求出原问题的解,那么这种分治算法就是可行的。由分治算法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易求出其解。由此自然引出递归算法。分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。 本次课程设计正是采用分治算法来解决循环赛日程表的安排问题。根据算法的设计结果,采用c语言实现算法,通过测试分析,程序运行结果正确,运行效率较高。 关键词:分治算法

目录 摘要 ..................................................................................................................... I 1 问题描述 (1) 2 问题分析 (2) 3 算法设计 (3) 4 算法实现 (7) 5 测试分析 (11) 结论 (12) 参考文献 (13)

1 问题描述 设有n位选手参加网球循环赛,n=2k,循环赛共进行n-1天,每位选手要与其他n-1位选手比赛一场,且每位选手每天比赛一场,不能轮空,按以下要求为比赛安排日程, 1)每位选手必须与其他n-1格选手格赛一场; 2)每个选手每天只能赛一场; 3)循环赛一共进行n-1天; 请按此要求将比赛日程表设计成有n行和n-1列的一个表。在表中的第i行和第j列处填入第i个选手在第j天所遇到的选手,其中1≤i≤n,1≤j≤n-1。

C语言程序设计(医院信息管理系统)附源代码

C语言程序设计(医院信息管理系统)附源代码

————————————————————————————————作者:————————————————————————————————日期:

专业设计报告 课程名称: C 语言程序设计课题名称:医院信息管理系统 专业班别:12本计算机科学与技术二班 姓名: 学号: 指导教师: 设计日期:2012-5-25

教师评语: 等级 优良中及格差项目 专业设计目的 设计基本要求 算法分析 源程序代码 源程序代码测试 设计总结 成绩评定: 指导教师签名: 日期:2012 年月日

课程设计题目医院信息管理程序 作者姓名: 同组成员: 摘要利用结构体存储每个病人的信息和每种药品的信息,并使用链表存储全部病人的信息;能完成对医院内所有病人信息的注册、查询、删除和修改等操作,同时又能对药房内库存的药品进行查询;可以将链表中的病人信息保存在文件中,并且可以对文件中的病人信息进行读取与显示 1.专业设计目的 1、掌握链表的操作,包括链表节点的创建、释放还有链表的遍历 2、掌握对二进制文件的创建、增添等基本操作。 3、熟悉C语言函数的使用方法,学会模块化处理问题以及多个源文件的处理方式 2.设计基本要求( 1、使用结构体来存储病人的信息,结构体中包括病的id号码、姓名、病历以及消费信息,并用链表将所有病人信息整合。 2、用文件来存储链表的信息以便下次再使用该程序时载入病人信息 3、能够实现病人信息的注册、病人信息的查询、病人消费统计、保存链表信息、载入链表信息、查询库存等几项功能。 4、要求用四个源文件main.c、link.c、find.c、save_load.c 5、系统完成后应实现类似下面所示界面

循环赛日程表_文档

循环赛日程表文档 一、问题描述: 设有n个运动员要进行循环赛。现要设计一个满足以下要求的比赛日程表: 1.每个选手必须与其他n-1个选手各赛一次; 2.每个选手一天只能参赛一次; 3.n是偶数时,循环赛在n-1天内结束。n是奇数时,循环赛进行n天. 二:程序源代码: #include #include void Table ( int **a , int n); int main() { int i=1,j; int days,n; int **a; //日程表数组 printf("请输入运动员人数:"); scanf("%d",&n); if (n<=1) printf("不可能出现此数据"); else { a=new int* [n+1]; //行表示运动员 days = n%2==0?n-1:n; //比赛天数,n是偶数时,n-1天。n是奇数时,n 天. for(i=1;i<=(n+1);i++) a[i] = new int [days+1]; } if(n%2!=0) Table(a,n); else { Table(a,n-1); //加入第n个运动员的比赛日程,只需将其加入到前n-1个运动员日程中轮空位置即可 for(i=1;i<=n;i++) { a[i][i]=n;

a[n][i]=i; } } //输出表头 printf("\n "); for(j=1;j<=days;j++) printf("第%d天 ",j); printf("\n"); //输出比赛日程 for(i=1;i<=n;i++) { printf("第%d号 ",i); for(j=1;j<=days;j++) printf("%d ",a[i][j]); printf("\n"); } printf("\n"); system("pause"); } void Table ( int **a , int n) { int i,j,m1,m2; int *b; //指向对阵关系数组 //建立初始对阵关系(,n-1,2,n-2,...,i,n-i) b=new int [n]; //0下标不用 for(i=1;i<=n/2;i++) { b[2*i-1]=i; b[2*i]=n-i; } for(i=1;i<=n;i++)//i控制天数变化 { a[i][i]=0; //n为奇数时在第i天第i号运动员轮空 for(j=1;j<=(n-1);j+=2) { //第i天m1与m2对阵 m1=((b[j]+i)<=n)?(b[j]+i):(b[j]+i)%n; m2=((b[j+1]+i)<=n)?(b[j+1]+i):(b[j+1]+i)%n; a[m1][i]=m2; a[m2][i]=m1; }

双循环赛的编排方法

(二)双循环赛的编排方法 双循环赛比赛轮次表的排法与单循环相同,只要排出第一循环,第二循环可按表重复一次(表3),也可重新抽签另排位置。第二循环的比赛如何进行,应在竞赛规程中明确规定。双循环赛的轮次与场次,均为单循环的一倍。 表3 5个队参加双循环比赛轮次安排表 第一轮第二轮第三轮第四轮第五轮 第一循环0——50——40——30——20——1 1——45——34——23——12——5 2——31——25——14——53——4 第二循环0——50——40——30——20——1 1——45——34——23——12——5 2——31——25——14——53——4 (三)分组循环赛的编排方法 分组循环通常分预赛和决赛两个阶段。 1.预赛阶段 按规程规定将参赛队分为几个小组,各组参照单循环编排,排出小组比赛表,然后确定种子队的位置。分组循环赛一般按分组数或分组数的2倍数确定种子,若种子数与组数相等,则将种子队分别安排在各小组的1号位置,如种子队为组数的2倍,应采用“蛇形”排列法,将种子队依次排列在各小组的1、2号位置上,非种子队也应抽签后定位。现将分组单循环赛抽签和“蛇形”排列法介绍如下: (1)首先在联席会上协商确定种子队:种子队数一般等于组的组数。如果分4个组进行比赛,应有4个种子队。为了使比赛更合理,也可以多选出几个种子队,但必须是组数的倍数。如分4个组进行比赛,可确定8个种子队。第一号种子队与第八号种子队编为一组;第二号种子队与第七号种子队编为一组,依此类推。 (2)抽签方法:种子队先抽签,确定各种子队的组别,然后其他各队再抽签确定组别。

例如,20个队分为4组,除8个种子队外,其他12个队再抽签。签号分为4组,每组有相同的3个签,由12个队抽签确定组别,然后再把各队按组别填入各组的比赛轮次表中。另外一种分组方法为蛇形排列分组,即按上一届名次进行分组。例如,有16个队分为4个组时,其排法如表4: 表4 16个队分4组比赛安排表 第一组第二组第三组第四组 1234 8765 9101112 16151413 2.决赛阶段 各队在预赛阶段分组单循环赛中的名次,将决定其进入决赛阶段比赛的位置。在预赛阶段已经相遇过的队,比赛成绩依然有效,决赛阶段不再进行比赛。其常用的比赛方法有,同名次赛、分段赛、交叉赛、录取名次赛等。 (1)同名次赛:就是将各小组预赛中相同名次编在一起进行比赛,如预赛时四个组的第一名编成一组进行单循环赛,决出1~4名,各小组的第二名编在一起决出5~8名。 (2)分段赛:将各小组的名次分为几段,同一段名次的队编在一组决出总名次,如预赛两个组的1、2名编在一起决出1~4名,两个组的3、4名,编在一起排出5~8名。 (3)交叉赛:各组的前两名交叉比赛,两场胜者进行决赛争夺1、2名,两场负者再相互比赛决出3、4名,各组3、4名用同样方法决出5~8名,其余类推。 (4)录取名次赛:根据竞赛规程规定的录取名次,在各小组中取录数量相等的队进入决赛(参加第二阶段决赛队的数量应等于或略高于录取名次的队)。例如,有16个队参赛,规定录取前8名,预赛分成两个组,则每组前4名的队,进入第二阶段决赛,其余的队不再比赛。 (四)循环比赛日程编排的注意事项 循环赛要求每个参赛队(人)和其他参赛队之间都要进行比赛。从比赛对象上看,保证了参加者均等的机会,但在比赛顺序和比赛条件上仍存在着机会不均等的问题。如与强、弱对手相遇时间的先后问题;实力相近两队之间决定性比赛前,各自体力消耗多少的问题(指各自在前一场比赛对手的强弱和休息间隔时间的不均等);各参赛队比赛进度先后不一致问题;比赛场地条件的优劣及对场地条件适应能力等问题。要做到各方面条件完全均等是不可能的,但在编排中应尽量使这些不均等因素降到最低限度,使整个比赛获得更好效果。

相关文档
最新文档