【数学不建模】赛程安排

news2024/11/26 7:37:30

你所在的年级有5个班,每班一支球队在同一块场地上进行单循环赛, 共要进行10场比赛. 如何安排赛程使对各队来说都尽量公平呢. 下面是随便安排的一个赛程: 记5支球队为A, B, C, D, E,在下表左半部分的右上三角的10个空格中, 随手填上1,2,10, 就得到一个赛程, 即第1场A对B, 第2场B对C, , 第10场C对E. 为方便起见将这些数字沿对角线对称地填入左下三角.
这个赛程的公平性如何呢, 不妨只看看各队每两场比赛中间得到的休整时间是否均等. 表的右半部分是各队每两场比赛间相隔的场次数, 显然这个赛程对A, E有利, 对D则不公平.

从上面的例子出发讨论以下问题:
1)对于5支球队的比赛, 给出一个各队每两场比赛中间都至少相隔一场的赛程.
2)当n支球队比赛时, 各队每两场比赛中间相隔的场次数的上限是多少.
3)在达到2) 的上限的条件下, 给出n=8, n=9的赛程, 并说明它们的编制过程.

问题一

在这里插入图片描述

问题二

偶数个球队:各队每两场比赛中间相隔的场次数的最小值的上限是 n 2 − 1 \dfrac{n}{2}-1 2n1
奇数个球队:各队每两场比赛中间相隔的场次数的最小值的上限是 n − 3 2 \dfrac{n-3}{2} 2n3
向下取整后,不分奇偶,都是 n − 3 2 \dfrac{n-3}{2} 2n3
式子来源: R ≤ ( n − 3 ) / 2 R\le (n-3)/2 R(n3)/2, R R R为间隔

问题三

编制过程:(暂不给予说明)

#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 20;
int n,r,nx,mr;
vector<pair<int,int> >v(200);
vector<int>chose(200);//选择
int interval[N];//间隔
int ans[N][N];//答案矩阵

//优化结构
map<pair<int,int>,int>mv;//对局->选择
int maxn[N];//当前球队比赛场次最大值(球队上次比赛的场次)

void f(int);
inline void print_ans();

int main(){ // n=12 运行时间突变
    cin >> n; // n个球队
    r = (n-3)/2;//间隔下线(下限)

    nx = (n-1)*n/2;//(n-1)+(n-2)+...+1
    //step1. 列出每一个对局(小数在前),并初始化对局
    int x = 1;
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            v[x++] = make_pair(i,j);
            mv[{i,j}]=x-1;
        }
    }
    for(int i=1;i<=n;i++){
        interval[i] = -1;
        maxn[i] = -1;
    }
    //step2. 初始化选择
    if(n%2==0){
        mr = r+3;//间隔上限
        int k = 1;
        //12 34 ... n-1 n
        for(int i=1;i<=n-1;i+=2){
            ans[i][i+1] = ans[i+1][i] = (i+1)/2;
            maxn[i]=maxn[i+1] = k;
            chose[k++]=mv[{i,i+1}];
        }
        for(int i=1;i<=n-5;i+=4){
            for(int j=0;j<2;j++){
                //ans[i+j][i+j+2] = ans[i+j+2][i+j] = k;
                ans[i+j][(i+j+2+n)%n] = ans[(i+j+2+n)%n][i+j] = k;
                maxn[i+j]=maxn[(i+j+2+n)%n] = k;
                chose[k++]=mv[{i+j,(i+j+2+n)%n}];
            }
        }
        f(k);
    }
    else{
        mr = r+2;//间隔上限
        int k = 1;
        //12 34 ... n-2 n-1
        for(int i=1;i<=n-2;i+=2){
            ans[i][i+1] = ans[i+1][i] = (i+1)/2;
            maxn[i]=maxn[i+1] = k;
            chose[k++]=mv[{i,i+1}];
        }
        f(k);
    }
    //print_ans();
    return 0;
}
bool flag = false;
void f(int x){

    if(flag || x == nx+1){
        if(!flag)
            print_ans();
        flag = true;
        //all return
        //cout ans
        return ;
    }
    //step3. 算间隔,取出必选(可选)的列表(对局列表)
    vector<int>must_chose;
#if 0
    for(int i=1;i<=r+1;i++){// x x-1 x-2 .. x-r
        pair<int,int> pi_t = v[chose[x-i]];
        interval[pi_t.first] = interval[pi_t.second] = i;
    }
#endif
    bool m_or_ke = false;//false 表示 是可选列表, 反之是必选
    vector<int>must_n;
    vector<int>no_n;
    for(int i=1;i<=n;i++){
        if(maxn[i]==-1){//没被选过
            must_n.push_back(i);
            continue;
        }
        if(m_or_ke){//必选已经出来了
            if(x-maxn[i]>mr)must_n.push_back(i);//直接加必选
            if(x-maxn[i]<=r)no_n.push_back(i);//不可选
            continue;
        }
        if(x-maxn[i]>mr){
            if(!m_or_ke)must_n.clear();
            m_or_ke = true;
            must_n.push_back(i);
        }
        else if(x-maxn[i]>r){
            must_n.push_back(i);
        }
        else{
            no_n.push_back(i);//不可选
        }
    }

    //预处理
    bool mn_[n+1];
    for(int i=1;i<=n;i++)mn_[i]=false;
    for(auto xx:must_n)mn_[xx]=true;
    for(auto xx:no_n)mn_[xx]=false;

    //must_n -> must_chose

    //for(int i=1;i<=nx;i++){//可优化
    //    if(mn_[v[i].first]&&mn_[v[i].second])must_chose.push_back(i);
    //}

    for(int i=1;i<=n;i++){//优化后
        if(!mn_[i])continue;
        for(int j=i+1;j<=n;j++){
            if(mn_[j]){
                must_chose.push_back(mv[{i,j}]);
            }
        }
    }

    int mi = must_chose.size();
    for(int i=0;i<mi;i++){
        //check
        if(ans[v[must_chose[i]].first][v[must_chose[i]].second])continue;
        //chose
        chose[x] = must_chose[i];
        ans[v[must_chose[i]].first][v[must_chose[i]].second] = x;
        ans[v[must_chose[i]].second][v[must_chose[i]].first] = x;

        int vf_maxn = maxn[v[must_chose[i]].first];//备份
        int vs_maxn = maxn[v[must_chose[i]].second];
        maxn[v[must_chose[i]].first] = maxn[v[must_chose[i]].second] = x;
        f(x+1);
        //cut chose
        ans[v[must_chose[i]].first][v[must_chose[i]].second] = 0;
        maxn[v[must_chose[i]].first] = vf_maxn;
        maxn[v[must_chose[i]].second] = vs_maxn;
    }
}
inline void print_ans(){

    for(int i=1;i<=n;i++){
        vector<int>v1;
        for(int j=1;j<=n;j++){
            cout << ans[i][j] << ' ';
            v1.push_back(ans[i][j]);
        }
        sort(v1.begin(),v1.end());
        cout << ',';
        for(int j=2;j<n;j++){
            cout << v1[j]-v1[j-1]-1 << ' ';
        }
        cout << '\n';
    }
    return ;

    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++)
            cout << ans[i][j] << ' ';
        cout << '\n';
    }
}

代入n=9 / n=8答案可出

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1717761.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新书推荐:9.5堆栈图解析生命周期

本节必须掌握的知识点&#xff1a; 掌握局部变量、全局变量存放在哪 熟练画堆栈图 掌握每个函数从哪开始被调用的&#xff0c;从哪结束的 开始看本节前&#xff0c;请读者思考如下几问题&#xff1a; 局部变量存放在哪里&#xff1f;全局变量存放在哪里&#xff1f;编译器是怎…

FPGA新起点V1开发板(七-语法篇)——程序框架+高级语法(选择性做笔记)

文章目录 一、模块结构二、赋值三、条件语句 一、模块结构 默认是wire类型&#xff0c;assign是定义功能。 上面这两个always都是并行 例化 二、赋值 有两种赋值“”和“<” “”是阻塞赋值&#xff0c;也就是从上到下&#xff0c;依次完成 “”是非阻塞赋值&#xff0c;…

uniapp实现图片上传——支持APP、微信小程序

uniapp实现图片、视频上传 文章目录 uniapp实现图片、视频上传效果图组件templatejs 使用 相关文档&#xff1a; 结合 uView 插件 uni.uploadFile 实现 u-upload uploadfile 效果图 组件 简单封装&#xff0c;还有很多属性…&#xff0c;自定义样式等…根据个人所需调整 te…

element中table的selection-change监听改变的那条数据的下标

<el-table ref"table" :loading"loading" :data"tableData" selection-change"handleSelectionChange"></el-table>当绑定方法selection-change&#xff0c;当选择项发生变化时会触发该事件 // 多选框选中数据handleSele…

App自动化测试_Python+Appium使用手册

一、Appium的介绍 Appium是一款开源的自动化测试工具&#xff0c;支持模拟器和真机上的原生应用、混合应用、Web应用&#xff1b;基于Selenium二次开发&#xff0c;Appium支持Selenium WebDriver支持的所有语言&#xff08;java、 Object-C 、 JavaScript 、p hp、 Python等&am…

链动3+1模式:数字化转型中的创新商业发展路径

在数字化时代&#xff0c;企业为了保持竞争力&#xff0c;不断探索和尝试新的商业模式。链动31模式作为一种创新的商业模式&#xff0c;以其独特的运作机制&#xff0c;为企业和个人带来了全新的发展机遇。本文将对链动31模式进行深入解析&#xff0c;并通过与传统链动模式的对…

Github 如何配置 PNPM 的 CI 环境

最近出于兴趣在写一个前端框架 echox&#xff0c;然后在 Github 上给它配置了最简单的 CI 环境&#xff0c;这里简单记录一下。 特殊目录 首先需要在项目根目录里面创建 Github 仓库中的一个特殊目录&#xff1a;.github/workflows&#xff0c;用于存放 Github Actions 的工作…

vm-bhyve:bhyve虚拟机的管理系统@FreeBSD

先说情况&#xff0c;当前创建虚拟机后网络没有调通....不明白是最近自己点背&#xff0c;还是确实有难度... 缘起&#xff1a; 前段时间学习bhyve虚拟机&#xff0c;发现bvm这个虚拟机管理系统&#xff0c;但是实践下来发现网络方面好像有问题&#xff0c;至少我花了两天时间…

自动化捡洞/打点必备神器

工具介绍 毒液流量转发器Venom-Transponder&#xff1a;自动化捡洞/打点/跳板必备神器&#xff0c;支持联动URL爬虫、各种被动扫描器&#xff1b;该工具支持在mac/windows/linux等系统上使用。 该流量转发器诞生背景&#xff1a; 鉴于平时挖洞打点时用到被动扫描器&#xff0…

物联网——TIM定时器、PWM驱动呼吸灯、舵机和直流电机

定时器概念&#xff08;常用于输出PWM波形&#xff0c;驱动电机&#xff09; 时间脉冲数时钟周期&#xff1b; 这里的脉冲数6553665536&#xff0c;支持定时器级联&#xff0c;从而延长定时 定时器类型 基本定时器原理图&#xff08;UI:更新中断&#xff0c; U:更新事件&#…

C语言 | Leetcode C语言题解之第119题杨辉三角II

题目&#xff1a; 题解&#xff1a; int* getRow(int rowIndex, int* returnSize) {*returnSize rowIndex 1;int* row malloc(sizeof(int) * (*returnSize));row[0] 1;for (int i 1; i < rowIndex; i) {row[i] 1LL * row[i - 1] * (rowIndex - i 1) / i;}return row…

如何查看本地sql server数据库的ip地址

程序连线SQL数据库&#xff0c;需要SQL Server实例的名称或网络地址。 1.查询语句 DECLARE ipAddress VARCHAR(100) SELECT ipAddress local_net_address FROM sys.dm_exec_connections WHERE SESSION_ID SPID SELECT ipAddress As [IP Address]SELECT CONNECTIONPROPERTY(…

windows中安装zookeeper

https://zhuanlan.zhihu.com/p/692451839 Index of /apache/zookeeper/zookeeper-3.9.2 Zookeeper的应用场景 1、配置管理 2、服务注册中心 3、主从协调 4、分布式锁。&#xff08;客户端在一个节点下创建有序节点&#xff0c;如果分配的节点号最小&#xff0c;则获取锁&am…

MySQL事务与并发控制案例

1. MySQL在事务与并发控制情况下加锁案例实现 第一步&#xff1a;开启一个事务并发锁 第二步&#xff1a;对加X锁&#xff08;排他锁&#xff09;的数据进行操作 可以看到锁被阻塞了&#xff1b; 2. 锁超时或死锁怎么办&#xff1f; Deadlock found when trying to get lock…

Redis之持久化、集群

1. Redis持久化 Redis为什么需要持久化?因为Redis的数据我们都知道是存放在内存中的&#xff0c;那么每次关闭或者机器断电&#xff0c;我们的数据旧丢失了。 因此&#xff0c;Redis如果想要被别人使用&#xff0c;这个问题就需要解决&#xff0c;怎么解决呢?就是说我们的数…

关于OpenFlow协议的运行机制和实践分析(SDN)

目录 OpenFlow运行机制 1 OpenFlow信道建立 1.1 OpenFlow消息类型 1.2 信道建立过程解析 2 OpenFlow消息处理 2.1 OpenFlow流表下发与初始流表 2.2 OpenFlow报文上送控制器 2.3 控制器回应OpenFlow报文 3 OpenFlow交换机转发 3.1 单播报文转发流程 OpenFlow的实践分析…

C++的第一道门坎:类与对象(三)

目录 一.再谈构造函数 1.1构造函数体赋值 1.2初始化列表 1.3explicit关键字 二.static成员 2.1概念 ​编辑 2.2特性 三.友元 3.1友元函数 3.2友元类 4.内部类 一.再谈构造函数 1.1构造函数体赋值 class Date { public:Date(int year,int month,int day){_year ye…

使用KEPServer连接欧姆龙PLC获取对应标签数据(标签值类型改为字符串型)

1.创建通道&#xff08;通道&#xff09;&#xff0c;&#xff08;选择对应的驱动&#xff0c;跟当前型号PLC型号对应&#xff09;。 2.创建设备&#xff0c;&#xff08;填入IP地址以及欧姆龙的默认端口号&#xff1a;44818&#xff09; 3.创建对应的标签。这里关键讲诉下字…

【VSCode实战】转换大小写快捷键

今天在VSCode Insiders上编码&#xff0c;突然想将某常量转换为大写。按照virtual studio的习惯&#xff0c;我Ctrl Shift U没有效果&#xff0c;Ctrl U也没效果。网上搜了搜&#xff0c;原来VSCode Insiders没有这个默认功能。 而VSCode Insiders这么强大怎么可能没有大小…

Keras深度学习框架实战(1):图像分类识别

1、绪论 1.1 图像分类的定义 图像分类是计算机视觉领域中的一项基本任务&#xff0c;其定义是将输入图像分配给预定义类别中的一个或多个。具体来说&#xff0c;图像分类系统接受一个图像作为输入&#xff0c;并输出一个或多个类别标签&#xff0c;这些标签描述了图像中的内容…