首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

看上这个题的思路

2012-12-28 
看下这个题的思路。设有n个球队要进行排球循环赛,设计一个满足以下要求的比赛日程表:每个球队必须与其他n-1

看下这个题的思路。
设有n个球队要进行排球循环赛,设计一个满足以下要求的比赛日程表:
每个球队必须与其他n-1个球队各赛一次;
每个球队一天只能赛一次;
当n是偶数时,循环赛进行n-1天。当n是奇数时,循环赛进行n天。
  n=6的比赛日程表示例(把6个队从1到6进行编号):

  n=5的比赛日程表示例(增加编号0,凡碰0者该天即轮空):


  (1)请根据以上要求分析问题,设计算法,并加以说明;
  (2)编程实现算法,并以n=10和n=15进行测试,输出结果;
(3)分析算法的时间复杂度。
[最优解释]
public class SaiCheng {
private int[] dw = null;

public void init(int n){
//是否是偶数队
boolean isOdd = true;
        //初始化数据
if (n % 2 != 0) {
isOdd = false;
dw = new int[n + 1];
} else {
dw = new int[n];
}
int len = dw.length;

if (isOdd) {
for (int i = 0; i < len; i++) {
dw[i] = i + 1;
//System.out.println(dw[i]);
}
} else {
for (int i = 0; i < len; i++) {
dw[i] = i;
//System.out.println(dw[i]);
}
}
}

public void printSc()
{
int len = dw.length;
//逆时针轮换
for(int i = 0; i < len -1; i++){
System.out.println("第"+(i+1)+"天");
for(int j= 0 ;j< len/2;j++)
{
 System.out.println(dw[j] + "--" + dw[len - 1 - j]);
}
//把数组元素从第三位开始往后移,第二位设成最后一个值
int last = dw[len -1];
for(int k=len-1;k>1;k--)
{
dw[k]= dw[k-1];
}
dw[1] = last;
}
}

public static void main(String[] args) {
SaiCheng sc = new SaiCheng();
sc.init(10);
sc.printSc();

}

}
O(n^2)
[其他解释]
 
1 23456 5   0
2-13456 5   1
3 12456 5   2
4 12356 5   3
5 12346 5   4
6 12345 5   5

30 去掉其中相同的 5+4+3+2+1 种 15种不同的  每天的比赛 随即取15个中的3个 

当为奇数是 
 
0 12345   0
1 02345   1
2 01345   2
3 01245   3
4 01235   4
5 01234   5

30种    15种 如上 每天去三个随即组合



 

n 为偶数 
1 2--n-1       0
2 13--n-1      1
3 124--n-1     2
4 1234--n-1    3
5 12346--n-1   4
n 123456--n-1  n-1

总共sum=n*(n-1)   重复的z=1+2+3+4+...(n-1) 个      每天随机取 (sum-z)/(n-1) 个 



 

定义一个二位数组a[n-1][n-1]

         列
           0  1  2  3  4  5  6  7  8  9   n-1

行  0      1  2  3  4  5  6  7  8  9  n-1 n


    1      2  1  3  4  5  6  7  8  9  n-1 n
    2      3  1  2  4  5  6  7  8  9  n-1 n
    3      4  1  2  3  5  6  7  8  9  n-1 n
    4      5  1  2  3  4  6  7  8  9  n-1 n
    5      6  1  2  3  4  5  7  8  9  n-1 n
    6      7  1  2  3  4  5  6  8  9  n-1 n
    7      n  1  2  3  4  5  6  7  8  9   n-1

 a[0][0]=1  a[0][1]=2  a[0][2]=3  a[0][n-1]=n
 a[1][0]=2  a[1][1]=1  a[1][2]=3

当 a[][]   行数=列数的时候 删除  行数和列数同时自增 
           a[x][y] 当x=y时 删除 a[0][0] 到a[x][y]的数据、

 剩下的数组中 不为空的a[x][y]   




         列
           0  1  2  3  4  5  6  7  8  9   n-1

行  0      0  2  3  4  5  6  7  8  9  n-1 n
    1      0  0  3  4  5  6  7  8  9  n-1 n
    2      0  0  0  4  5  6  7  8  9  n-1 n
    3      0  0  0  0  5  6  7  8  9  n-1 n
    4      0  0  0  0  0  6  7  8  9  n-1 n
    5      0  0  0  0  0  0  7  8  9  n-1 n
    6      0  0  0  0  0  0  0  8  9  n-1 n
    7      0  0  0  0  0  0  0  0  8  9   n-1 

a[0][1] a[0][2] a[0][3]
a[1][2] a[1][3] a[1][4]
a[2][3] a[2][4] a[2][5]
a[3][4] a[3][5] a[3][6]
a[4][5] a[4][6] a[4][7]

1-2 1-3 1-4
2-3 2-4 2-5
3-4 3-5 3-6
4-5 4-6 4-7
5-6 5-7 5-8
......
每天的 随即组合中 x!=y 


1-2  3-5 4-6  就是其中一组 
1-3  2-4 5-6  也是一组



个人想法 难免有错 权当给楼主提供一个思路
[其他解释]

引用:
public class SaiCheng {
private int[] dw = null;

public void init(int n){
//是否是偶数队
boolean isOdd = true;
        //初始化数据
if (n % 2 != 0) {
isOdd = false;
dw = new int[n + 1];
}……


能说下思路吗, 没看详细
[其他解释]
比如1,2,3,4,5,6,六只球队,轮转配对,先是1-6,2-5,3-4,接着变成1,6,2,3,4,5,再配对1-5,6-4,2-3,接着变成1,5,6,2,3,4,就是从第二个对整体往后移,最后一个队,放到第二个上面。
[其他解释]
引用:
比如1,2,3,4,5,6,六只球队,轮转配对,先是1-6,2-5,3-4,接着变成1,6,2,3,4,5,再配对1-5,6-4,2-3,接着变成1,5,6,2,3,4,就是从第二个对整体往后移,最后一个队,放到第二个上面。


想法很不错啊!,比我想的效率高很多···。

热点排行