• 循环赛-(单循环)


    算法描述:以足球为例:n(n为偶数)只队伍,每只队伍要跟其他队伍每天都进行一场比赛,共n-1场比赛,需要n-1天,一只队伍一天只能进行一场比赛。

    算法实现:对n支队伍进行编号,以第一只队伍为例需要跟其他n-1只队伍进行比赛,但是对于每只队伍来说都在进行比赛,因此同一天内会有n/2场比赛。于是将所有队伍排成2排,每排队伍数量为n/2,排好之后为第一天的比赛对局,第二天的时候固定第一排第一支队伍,然后其他队伍进行顺时针或者逆时针旋转(仍然要保证每排队伍数量为n/2),旋转后的即为第二天的对局(这样既保证每个队伍都有比赛,又不会出现一只队伍在同一天有两场比赛),这种做法相当于每旋转一次进行一次错位排列,当旋转一周后,第一只队伍已经与其他n-1只队伍都进行了一次比赛,响应的其他队伍也都进行了n-1次比赛

    算法模拟:

    这里以6只队伍为例(比赛有5天,每天3场比赛),模拟一下比赛赛程:

    第一天:

    1      2      3

    6      5      4

    第二天:

    1      3      4

    2      6      5

    第三天:

    1      4      5

    3      2      6

    第四天:

    1      5      6

    4      3      2

    第五天:

    1      6      2

    5      4      3

    算法实现(java):

    1. public static void main(String[] args) {
    2. int n = 6;
    3. List teams = new ArrayList<>();
    4. teams.add("队伍1");
    5. teams.add("队伍2");
    6. teams.add("队伍3");
    7. teams.add("队伍4");
    8. teams.add("队伍5");
    9. teams.add("队伍6");
    10. roundRobin(n, teams);
    11. }
    12. /**
    13. * 循环赛
    14. * @param n 比赛队伍数量
    15. * @param teams 比赛队伍信息
    16. */
    17. private static void roundRobin(int n, List teams) {
    18. for(int i = 0; i< n -1; i++){
    19. System.out.println("第"+(i+1)+"天比赛********************");
    20. for(int j = 0; j< n /2; j++){
    21. String home="",away="";
    22. if(j==0){
    23. int rightIndex = i% n ==0? n -1:i% n;
    24. home = teams.get(j);
    25. away = teams.get(rightIndex);
    26. }else{
    27. int rightIndex = 0,leftIndex=0;
    28. if(j+i< n){
    29. leftIndex = j+i;
    30. }else{
    31. leftIndex = (j+i+1)% n;
    32. }
    33. if(j>i){
    34. rightIndex = (n -j+i)% n -1;
    35. }else if(j==i){
    36. rightIndex= n -1;
    37. }else{
    38. rightIndex = (n -j+i)% n;
    39. }
    40. home = teams.get(leftIndex);
    41. away = teams.get(rightIndex);
    42. }
    43. System.out.println(home + " VS " + away);
    44. }
    45. System.out.println("第"+(i+1)+"天比赛********************");
    46. }
    47. }

    运行结果:

    1. 1天比赛********************
    2. 队伍1 VS 队伍6
    3. 队伍2 VS 队伍5
    4. 队伍3 VS 队伍4
    5. 1天比赛********************
    6. 2天比赛********************
    7. 队伍1 VS 队伍2
    8. 队伍3 VS 队伍6
    9. 队伍4 VS 队伍5
    10. 2天比赛********************
    11. 3天比赛********************
    12. 队伍1 VS 队伍3
    13. 队伍4 VS 队伍2
    14. 队伍5 VS 队伍6
    15. 3天比赛********************
    16. 4天比赛********************
    17. 队伍1 VS 队伍4
    18. 队伍5 VS 队伍3
    19. 队伍6 VS 队伍2
    20. 4天比赛********************
    21. 5天比赛********************
    22. 队伍1 VS 队伍5
    23. 队伍6 VS 队伍4
    24. 队伍2 VS 队伍3
    25. 5天比赛********************

  • 相关阅读:
    JS中的函数
    python根据文件创建时间删除文件
    MQTT,如何在SpringBoot中使用MQTT实现消息的订阅和发布
    尚硅谷尚品项目汇笔记(一)
    机器学习基础05DAY
    用信号量实现进程互斥,同步【操作系统学习笔记】
    在C++中,`sync()`是一个用于刷新缓冲区的函数,通常用于文件或流的I/O操作。调用`sync()`函数会将所有等待写入的数据立即刷新到底层设备。
    每日一题|2022-11-23|1742. 盒子中小球的最大数量|Golang
    HttpClient远程调用基本使用(详解)
    线段树入门+例题详解
  • 原文地址:https://blog.csdn.net/chengmeng_123/article/details/126524893