篮球(5V5)比赛中,每个球员拥有一个战斗力,每个队伍的所有球员战斗力之和为该队伍的总体战斗力。现有10个球员准备分为两队进行训练赛,教练希望2个队伍的战斗力差值能够尽可能的小,以达到最佳训练效果。给出10个球员的战斗力,如果你是教练,你该如何分队,才能达到最佳训练效果?请输出该分队方案下的最小战斗力差值。

输入描述:

10个篮球队员的战斗力(整数,范围[1,10000]),战斗力之间用空格分隔,如:10 9 8 7 6 5 4 3 2 1

不需要考虑异常输入的场景。

输出描述:

最小的战斗力差值,如:1

示例1

输入

10 9 8 7 6 5 4 3 2 1

输出

1

说明

1 2 5 9 10分为一队,3 4 6 7 8分为一队,两队战斗力之差最小,输出差值1。备注:球员分队方案不唯一,但最小战斗力差值固定是1。

这是一道动态规划的问题,难度较高,而且因为要求均分2组,还不太好转化为典型的背包问题。

在知道这是一道动态规划问题之前,我给出了自己的解法(目前我认为这个解法应该是错误的,但暂时还没有找到可以推翻这种解法的测试用例,所以暂时保留了这个解法)。

其基本思路为:

1.首先将队员按照战斗力排序;

2.为了保证战斗力均衡,可以得到战斗力最强的和最弱的必然分到一组,于是得到第一个小的分组(最强和最弱),期战斗力之和为SA,分到A组

3.在剩下的队伍当中两两组合,寻找战斗力最接近SA的组合,分到B组,其战斗力之和为SB,然后寻找最大最小的组合,然后更新SA(或者SB,这个需要在中间比较,看这个组合是放到SA合适还是SB合适),然后在剩下的组合当中寻找两两组合,使得SA和SB的差值最小,直到最后一组;

4.最后一组需要特殊处理一下,因为可能只有2个队员了,此时需要根据SA和SB的值,合理分配成员,最终得到分组结果。

代码为:

//author:autumoon
//联系QQ:4589968
//日期:2021-12-27int LeastGapGroup()
{int count = 10;vector<int> vValues;do{int val;cin >> val;if (val >= 1 && val <= 1e4){vValues.push_back(val);}} while (vValues.size() < count);std::sort(vValues.begin(), vValues.end());std::vector<int> vFlag;for (int i = 0; i < 10; ++i){vFlag.push_back(-1);}//max min togethervFlag[0] = 0;vFlag[9] = 0;int nGapMin = 0;for (int i = 0; i < 10; ++i){nGapMin += vValues[i];}//fenbie liangzu sumint nSum[2] = { 0 };nSum[0] = vValues[0] + vValues[9];nSum[1] = 0;//int nCurIndex = 1;//leftvector<int> vLeftValues = GetLeftVector(vValues, vFlag);int nLeftCount = vLeftValues.size();do{//zhao b duinLeftCount = vLeftValues.size();nGapMin = 0;for (int i = 0; i < nLeftCount; ++i){nGapMin += vLeftValues[i];}int nSelIndex1 = -1;int nSelIndex2 = -1;for (int i = 0; i < nLeftCount; ++i){int nSel1 = vLeftValues[i];for (int j = i + 1; j < nLeftCount; ++j){int nSel2 = vLeftValues[j];int nTmp = nSel1 + nSel2 + nSum[nCurIndex];if (abs(nTmp - nSum[!nCurIndex]) < nGapMin){nGapMin = abs(nTmp - nSum[!nCurIndex]);nSelIndex1 = i;nSelIndex2 = j;}}}if (nSelIndex1 != -1 && nSelIndex2 != -1){vFlag[nSelIndex1] = 1;vFlag[nSelIndex2] = 1;nSum[nCurIndex] += vLeftValues[nSelIndex1] + vLeftValues[nSelIndex2];//zuida he zuixiao gei A ? BvFlag.clear();for (int i = 0; i < vLeftValues.size(); ++i){vFlag.push_back(-1);}if (vLeftValues.size() > 2){//jueding gei shuinCurIndex = nSum[nCurIndex] < nSum[!nCurIndex] ? nCurIndex : !nCurIndex;vFlag[0] = nCurIndex;vFlag[vLeftValues.size() - 1] = nCurIndex;nSum[nCurIndex] += vLeftValues[0] + vLeftValues[vLeftValues.size() - 1];vLeftValues = GetLeftVector(vLeftValues, vFlag);nLeftCount = vLeftValues.size();nCurIndex = !nCurIndex;}else if (vLeftValues.size() == 2){//yibianjiayigeif (abs(nSum[nCurIndex] + vLeftValues[0] - (nSum[!nCurIndex] + vLeftValues[1])) < abs(nSum[!nCurIndex] + vLeftValues[1] - (nSum[nCurIndex] + vLeftValues[0]))){nSum[nCurIndex] += vLeftValues[0];nSum[!nCurIndex] += vLeftValues[1];}else{nSum[!nCurIndex] += vLeftValues[1];nSum[nCurIndex] += vLeftValues[0];}vLeftValues.clear();}}else{break;}} while (nLeftCount > 1);cout << abs(nSum[nCurIndex] - nSum[!nCurIndex]) << endl;
}

篮球比赛分组问题(动态规划)相关推荐

  1. php篮球比赛,篮球数据API接口 - 【篮球比赛动画直播变化数据】API调用示例代码...

    篮球比赛动画直播变化数据API调用示例,详细请查看在线文档,需注册下 package com.huaying.demo.basketball; import javax.xml.bind.JAXBCo ...

  2. 篮球竞赛24秒计时器quartus_篮球比赛的基本规则

    从2003年初三成为一名体育生开始,到目前工作我最喜欢的运动还是篮球,从参加体育中考和体育高考的专项是篮球,再到大学选专修还是篮球.参加过国家一级裁判的考试培训,在大学时也参与过CUBA记录台的工作, ...

  3. 【043】基于51单片机的篮球比赛积分计时系统Proteus仿真

    一.压缩包资料内容 (1).基于51单片机的篮球比赛积分计时系统proteus仿真设计一份: (2).基于51单片机的篮球比赛积分计时系统proteus仿真设计keli源代码一份: (3).基于51单 ...

  4. python动画篮球大小_篮球比赛动画直播数据api接口示例

    分享下篮球比赛动画直播api数据接口代码示例,详细了解请查看接口文档,需注册下 package com.huaying.demo.basketball; import javax.xml.bind.J ...

  5. php篮球比赛,篮球数据API接口-【篮球比赛动画直播变化数据】API调用示例代码...

    篮球比赛动画直播变化数据API调用示例,详细请查看在线文档,需注册下 package com.huaying.demo.basketball; import javax.xml.bind.JAXBCo ...

  6. 【毕业设计】51-基于Multisim的篮球比赛24秒倒计时计时器的设计(仿真工程+相关芯片资料+答辩论文)

    typora-root-url: ./ [毕业设计]51-基于Multisim的篮球比赛24秒倒计时计时器的设计(仿真工程+相关芯片资料+答辩论文) 文章目录 typora-root-url: ./ ...

  7. 篮球比赛计时计分系统

    JOYI篮球比赛电子计时记分系统是中意公司研发的专业级裁判系统,产品已经经过三次升级,从单片机裁判器到ARM斜面立体式系统裁判器,产品已经实现全数字化模块化设计,24秒14秒控制可以有线无线双用.计时 ...

  8. 计算机控制篮球,【精品课程设计】计算机控制技术弱电课程之篮球比赛计时计分器doc.doc...

    [精品课程设计]计算机控制技术弱电课程之篮球比赛计时计分器doc.doc 课程设计 题目 篮球赛计时计分器 二级学院 电子信息与自动化 专 业 电气工程及其自动化 班 级 学生姓名 学号 指导教师 考 ...

  9. 学生参加计算机比赛后的分析,湘南学院学生参加基本功大赛篮球比赛成绩分析和反思.doc...

    湘南学院学生参加基本功大赛篮球比赛成绩分析和反思 湘南学院学生参加基本功大赛篮球比赛成绩分析和反思 摘要:本文通过文献资料法.数据统计法等研究方法,对我院学生参加湖南省普通高校体育教育专业学生基本功大 ...

最新文章

  1. 应用vb编程_用VB编程来解决实际生活问题
  2. 功能整合(二):轮播图(可控)、事件流
  3. linux目录挂载到内存,Linux中内存挂载到目录下
  4. 使用spi协议,接收来自slave的数据之前写0xff的原因
  5. 一个C实现的线程池(产品暂未运用)
  6. 一会儿花雨停了的飞鸽传书
  7. python中的然后_返回,然后等待另一个函数在python中完成
  8. 百度地图手机和电脑不一致_手机能下载北斗星导航吗?比高德地图和百度地图好用吗?...
  9. Android中style和theme的区别
  10. 【SpringMVC 笔记】结果跳转、数据处理、乱码问题
  11. OSPF的多域配置-要点总结
  12. [4G+5G专题-145]: 一体化小基站- 5G小基站软件建议架构概述
  13. 单点登录系统和传统登录的区别
  14. goldengate 检查点的理解
  15. 百度图片翻译API,对开发者真的很友好
  16. ActiveMQ 停止 关闭 报错 ERROR: No or outdated process id in
  17. 电视盒子和机顶盒有什么区别?哪个更值得买?
  18. VMware vSphere Hypervisor 7(ESXi 7)
  19. 服务器英文系统配置双机热备,服务器双机热备部署
  20. gprMax中任意不规则形状建模与模拟

热门文章

  1. 很多人都想考一个RHCE吧,大家不妨看看我是怎么变成一个RHCE的。
  2. 怎么用EDIUS将静帧图片做出动态特效
  3. 计算适合打印的图纸大小
  4. 分布式调度平台xxl-job的使用及其算法分析
  5. 22套精致的用户界面 PSD 源文件素材
  6. CSipSimple 简单分析
  7. 电脑系统,win7与win10到底有什么区别?
  8. 什么是你的核心竞争力之六正视你的弱点
  9. ListView单行选中变色
  10. java远程打印机 文件_使用Java将文本文件打印到特定打印机