今天群里的同学说要写一个dota分组算法,即有一个数组,数组里面的元素是他各个同事的战斗力,问有没有什么算法能将他们按战斗力尽可能的分成两组。开始我没有很好地想法,想dota最多十个人,用枚举也不会太久,不过后来受群里讨论的启发,实现了如下方法:
#zdl = [[1, 3, 5, 10000000, 9], [2, 4, 6, 8, 7]].flatten
#zdl = [1,3,5,7,9,100] + [2,4,6,8,11]
zdl = [1, 2, 3, 4, 5, 100, 6, 7, 8, 9, 11]
#zdl = []
#30.times {zdl << rand(100)}
def partition arr
if arr.size.even?
a, b = arr[0, arr.size / 2], arr[arr.size / 2, arr.size / 2]
else
a, b = arr[0, arr.size / 2], arr[arr.size / 2, arr.size / 2 + 1]
if a.inject(&:+) <= b.inject(&:+)
a << b.min
b.delete_at(b.index(b.min))
end
end
adjust a, b
end
def adjust a, b
sum_a = a.inject &:+
sum_b = b.inject &:+
return a, b if sum_a == sum_b
if sum_a > sum_b
bigger_group, smaller_group = a, b
else
bigger_group, smaller_group = b, a
end
d_value = (sum_a - sum_b).abs
ii, jj = nil, nil
bigger_group.each_with_index do |big_value, i|
temp_d = d_value
smaller_group.each_with_index do |small_value, j|
if big_value > small_value
if d_value / 2 - (big_value - small_value) < temp_d && d_value / 2 >= (big_value - small_value)
temp_d = d_value / 2 - (big_value - small_value)
ii, jj = i, j
end
end
end
end
return bigger_group, smaller_group if ii.nil?
bigger_group[ii], smaller_group[jj] = smaller_group[jj], bigger_group[ii]
adjust bigger_group, smaller_group
end
p zdl
a, b = partition zdl
p a
p a.inject &:+
p b
p b.inject &:+
算法的思路是先将其随便分成两组,然后计算两组总战斗力的差,再从战斗力总值高的一组中取一个战斗力,减去从战斗力低的一组中一个值,如果这两个值的差值正好等于两组的差,互换后总战斗力就相等了。如果没有这样的值,那交换一个最接近的,之后再递归交换后的两组战斗力。
分享到:
相关推荐
这些图像具有多样化的视角、光照条件和物体尺寸,为训练和评估遥感图像对象检测算法提供了丰富的素材。DOTA_devkit的出现,使得处理这个大规模数据集变得更加便捷。 二、DOTA_devkit-master的核心功能 1. 数据转换...
在IT行业中,游戏开发是一项复杂而充满挑战的任务,特别是在与热门游戏如DOTA相关的项目中。DOTA(Defense of the Ancients)是一款基于《魔兽争霸III》的地图编辑器创作的多人在线战斗竞技游戏,拥有丰富的英雄角色...
【Dota改键精灵】是一款专为Dota爱好者设计的辅助工具,它的主要功能是帮助玩家自定义游戏内的快捷键设置,以适应个人的游戏习惯,提高操作效率和游戏体验。在Dota这款多人在线对战游戏中,每个英雄都有多个技能和...
dota6.67 ai地图,让你成为dota雄狮
《Dota 6.73 AI中文版地图详解与下载指南》 Dota,全名Defense of the Ancients,是一款基于暴雪娱乐公司《魔兽争霸III:冰封王座》的地图编辑器制作的多人在线对战游戏。6.73版本是Dota历史上的一个重要里程碑,...
1、资源内容:基于DOTA数据集的yolo训练+预训练的参数+源代码+文档说明 2、代码特点:内含运行结果,不会运行可私信,参数化编程、参数可方便更改、代码编程思路清晰、注释明细,都经过测试运行成功,功能ok的情况下...
《DOTA音效资源解析与应用》 DOTA(Defense of the Ancients)是一款深受全球玩家喜爱的多人在线战斗竞技游戏,其丰富的游戏元素和独特的音效设计为玩家带来了沉浸式的游戏体验。本资源包提供了DOTA的部分核心音效...
【Dota全图工具过11等】是一个针对Dota游戏的辅助工具,主要用于帮助玩家在11对战平台、HF(浩方)平台以及VS(战旗)平台等多人在线游戏环境中获得全图视野。全图视野意味着玩家能够看到地图上的所有区域,包括敌方...
【 DotA6.59c.rar 】是一个包含DotA(Defense of the Ancients)游戏更新的压缩包文件。这个版本是6.59c,是DotA Allstars系列地图的一个迭代,由冰蛙(IceFrog)或其他地图制作者进行维护和改进。DotA是一个基于...
在电子竞技领域,Dota(Defense of the Ancients)是一款深受玩家喜爱的多人在线对战游戏。"开图"在Dota中通常指的是利用特殊工具或方法获取游戏地图的全览信息,使得玩家能了解整个战场的情况,这在非正式比赛中...
- **压缩与存储**:VPK 文件内部采用了 ZIP 压缩算法,但对文件的读取进行了优化,使得游戏在运行时可以快速解压和访问。 - **版本控制**:VPK 文件支持多个版本的资源,游戏可以根据需要加载最新的或特定版本的资源...
DOTA6.59D常规,中文版本。有些微改动。此外防止互通作弊
dota地图 非常适合局域网的地图很好的哦 很好的哦
再者,"rar"是这个压缩包的格式,表明文件是以RAR压缩算法打包的。RAR是一种流行的文件压缩格式,具有较高的压缩率和文件修复功能。用户需要使用解压软件,如WinRAR,才能提取出压缩包内的"Dota Allstars v6.61b...
dota imba 3.80 AI,dota imba 3.80 AI,dota imba 3.80 AI
《Dota Replay Manager 3.0:全面解析与深度挖掘》 Dota Replay Manager 3.0是一款专为Dota爱好者设计的实用工具,旨在帮助玩家更好地管理和分析他们的游戏回放。这款软件的核心功能在于其高效地组织和播放Dota游戏...
Gym专注于强化学习,使用这些数据来进行算法的训练,并决定它应该做什么。 OpenAI的DOTA2人工智能使用了深度Q学习(Deep Q-Learning,简称DQN)和自我对战(Self-Play)的训练方式。DQN网络使用了带有贝尔曼方程的...
Dota中的各种声音集合...很好的资源
在《DOTA2》这款竞技游戏中,技能施法的效率对于玩家的操作至关重要。为了帮助玩家提升游戏体验,尤其是对于新手或者手速有限的玩家来说,智能施法是一个非常实用的功能。智能施法允许玩家更快地释放技能,而无需...
dota6.68的没加密地图,可以用最新的WE随便改图【需要最行的WE编辑器】