F:循环赛日程

2023-10-21 04:50
文章标签 日程 循环赛

本文主要是介绍F:循环赛日程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

F : 循环赛日程表

看了一下网上其他人写的,感觉思路都不太清晰,不是很好懂。
我按照我的理解写了一个自认为很好懂的思路。

Description

n = 2_k_个选手(编号1 ∼ n)进行循环赛,日程表要求:

  1. 每个选手必须与其他𝑛−1个选手各赛一次;
  2. 每个选手一天只能赛一次;
  3. 循环赛一共进行𝑛−1天.

设计一个𝑛行𝑛−1列的表,第𝑖行第𝑗列填入第𝑖个选手第𝑗天的对手.

Input

多组测试数据,每组给出选手个数_n_. 其中_n_ ≤ 32

Output

给出_n_行_n_ − 1列的日程表.

Sample Input

8

Sample Output

2 3 4 5 6 7 8
1 4 3 6 5 8 7
4 1 2 7 8 5 6
3 2 1 8 7 6 5
6 7 8 1 2 3 4
5 8 7 2 1 4 3
8 5 6 3 4 1 2
7 6 5 4 3 2 1

思路

这道题只要思路会了,循环条件可以理清,就可以很轻松写出来。

分治
这个分治是怎么分治的?
举个例子,n=8,也就是有8个选手
将分治的三个过程列出来:

  • 分解:4个“𝑛/2个选手比赛日程”的子问题
    (1)1 ~ 4号的第1 ~ 4天,对手1 ~ 4号;
    (2)1 ~ 4号的第5 ~ 8天,对手5 ~ 8号;
    (3)5 ~ 8号的第1 ~ 4天,对手5 ~ 8号;
    (4)5 ~ 8号的第5 ~ 8天,对手1 ~ 4号。
    而1~4号选手又可以分解为:1 ~ 2和3 ~ 4号
  • 解决:递归到只有一位选手的时候,之间返回即可
  • 合并:要搞清楚这四个子问题之间的关系,关系如下:
    (3)可以由(1)分别加“n/2”得到
    (4)等于(1)
    (2)等于(3)
    这么说可能会有点绕,可以看图;
    在这里插入图片描述

右下蓝色部分 = 左上蓝色部分
左下白色部分 = 左上蓝色部分 + 4(8/2)
右上白色部分 = 左下白色部分
可以看到颜色相同的部分是一样的,不同颜色的表格之间则差了n/2
那么根据这思路我们可以列出以下代码:

int addval = n/2;//前n/2的选手与后n/2的选手的号数之差  
for (int i = 0; i < n/2; ++i) {  for (int j = 0; j < n/2; ++j) {  //左上角与右下角一致  table[i+addval][j+addval] = table[i][j];  //左下角是左上角+addval  table[i+addval][j]=table[i][j]+addval;  //右上角等于左下角  table[i][j+addval]=table[i+addval][j];  }  
}

这里比较难理解的是,为什么i、j的范围是到n/2?
可以自己举个例子测试一下:
当选手只有两位(n=2)时
在这里插入图片描述

i、j只会到0,也就是只需要一个模板去填值。

当选手有四位时
在这里插入图片描述

模板便是红色圈住部分。
以此类推,可以发现模板的大小总是n/2。
完整代码如下:

#include "iostream"  
#define max 32  
using namespace std;  
int table[max][max];  void schedule(int n)  
{  if (n==1) //当只有1个选手的子问题,直接返回  return;  schedule(n/2);  //递归int addval = n/2;//前n/2的选手与后n/2的选手的号数之差  for (int i = 0; i < n/2; ++i) {  for (int j = 0; j < n/2; ++j) {  //左上角与右下角一致  table[i+addval][j+addval] = table[i][j];  //左下角是左上角+addval  table[i+addval][j]=table[i][j]+addval;  //右上角等于左下角  table[i][j+addval]=table[i+addval][j];  }  }  }  
void print(int num)  
{  for (int i = 0; i < num; ++i) {  for (int j = 1; j < num; ++j) {  cout<<table[i][j]<<" ";  }cout<<endl;  }  
}  
int main()  
{  int n;  cin>>n;  table[0][0]=1;   //最开始的模板schedule(n);  print(n);  return 0;  
}

这篇关于F:循环赛日程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/252031

相关文章

分治法,循环赛日程表

#include<stdio.h> #define N 64 void GameTable(int k,int a[][N]) { //n=2^k(k>=1)个选手参加比赛,二维数组a表示日程安排,数组下标从1开始 int n=2;//k=0,两个选手比赛日程可直接求得 //求解两个选手比赛日程,得到左上角元素 a[1][1]=1;a[1][2]=2; a[2][1

排日程 某保密单位机要人员 A,B,C,D,E 每周需要工作5天,休息2天。

package org.bluebridge.topics;/** 排日程某保密单位机要人员 A,B,C,D,E 每周需要工作5天,休息2天。上级要求每个人每周的工作日和休息日安排必须是固定的,不能在周间变更。此外,由于工作需要,还有如下要求:1. 所有人的连续工作日不能多于3天(注意:周日连到下周一也是连续)。2. 一周中,至少有3天所有人都是上班的。3. 任何一天,必须保证 A B C D 中

Flat Ads携7亿独家开发者流量再次亮相ChinaJoy!附CJ官方活动日程

2024 ChinaJoy,火爆依然! 根据官方披露的消息,本届ChinaJoy以“初心‘游’在,精彩无限”为主题,将于7月26日至7月29日如期举办。本届展会汇集了法国、美国、加拿大、德国、英国、日本、阿联酋、澳大利亚、比利时、韩国、马来西亚、葡萄牙、土耳其、新加坡等全球31个国家和地区的600余家知名企业参展,整体展出面积13万平米,外资企业近两百家,占比30%。其中BTOC参展企业近300

算法设计与分析 例题 绘制Huffman树、循环赛、分治、最短路与动态规划

1.考虑用哈夫曼算法来找字符a,b,c,d,e,f 的最优编码。这些字符出现在文件中 的频数之比为 20:10:6:4:44:16。要求: (1)(4 分)简述使用哈夫曼算法构造最优编码的基本步骤; (2)(5 分)构造对应的哈夫曼树,并据此给出a,b,c,d,e,f 的一种最优编码。 解:1)、哈夫曼算法是构造最优编码树的贪心算法。其基本思想是,首先所 有字符对应n 棵树构成的森林

用LangChain打造一个可以管理日程的智能助手

存储设计定义工具创建llm提示词模板创建Agent执行总结   众所周知,GPT可以认为是一个离线的软件的,对于一些实时性有要求的功能是完全不行,比如实时信息检索,再比如我们今天要实现个一个日程管理的功能,这个功能你纯依赖于ChatGPT或者其他大语言模型(后文简称llm),是完全实现不了的,比如你这次让他帮你记录个日程,你要是和他聊的内容过多,历史聊天记录滚动覆盖了就找不回来

vue实现周日历 日历按周切换 vue日程管理

实现的功能 1、点击今天:回到今日日期并选中今日日期,查当天数据 2、点击左箭头:切换上一周 3、点击右箭头:切换下一周 4、黄圆圈代表有日程提醒,点击选中,下方对应显示当前日程提醒的内容,没有内容则显示暂无数据 5、进入当前页面,默认选中当天日期,查当天数据 vue日程管理按月查询请看上一篇文章 具体代码 template <div class="schedule-ca

同步系统日历以及系统日历的日程

如果要同步应用的日程到系统日历,则需要首先添加应用权限设置。如上所示:   2.添加框架:#import <EventKit/EventKit.h> /** 同步到系统日历  */ -(void)aiChatSynchronizeToSystemCalendar{          // 创建一个EventKit事件存储对象     EKEventStore *eventStore =

2024全国现代流通经济创新大会暨城郊大仓基地高质量建设论坛日程发布

2024年4月19日 中国·平谷 建设城郊大仓基地 创新现代流通经济 一、大会开幕式&主论坛 时间:9:00-12:00 地点:博物馆一楼 报告厅 主持人:中国商业联合会商贸物流与供应链分会会长干为 08:30-09:00 大会入场&宣传片视频 09:00-09:10 【开幕欢迎辞】 中国商业联合会副会长 傅龙成 北京市平谷区委书记 唐海龙 09:10-09:20【部

分治算法-球队循环赛日程安排-java实现

/** * 分治法-球队循环赛事日程安排,球队数量最好是2的n次方,不然日程安排会出现空隙 * 采用分治法进行处理,将日程安排分成四个象限来处理 */public class RoundMatch { public void roundMatch(int[][] table, int n) { if (n == 1) { table[0][0] = 1; return;

2021年,ICPC比赛、CCPC比赛、CCF-CSP考试、蓝桥杯比赛、天梯赛日程

CCF-CSP考试日程: 第22次 4月11日(考试日期调整,这是最后的通知) 第23次 9月19日(根据官方通知,已经修改) 第24次 12月5日(官方更改了考试日期) CCSP比赛: 区域赛 本校 各个高校赛点 10月27日 总决赛 深圳 深圳大学 10月27日 ICPC比赛日程(第45届,2020年): 昆明站 昆明理工大学 2021年4月02-03日 线上赛 EC Final 西安 西