Dota2参议院与递增的三元子序列:算法揭示策略与模式的双重世界

article/2025/6/8 17:15:05

博客引言:

在我们的生活中,策略与模式无处不在,它们既是解决问题的关键,也是揭示隐藏规律的钥匙。今天,我们将通过两个有趣的问题,探索算法如何在策略博弈与模式识别中发挥作用。

首先,我们将探讨Dota2参议院问题,看看如何通过模拟投票过程,找到最终获胜的阵营。接着,我们将分析递增的三元子序列问题,探讨如何高效判断数组中是否存在递增的三元组。通过这两个案例,你将看到算法如何在策略博弈与模式识别中揭示隐藏的规律。

让我们一起进入算法的世界,探索这些隐藏在策略与模式背后的智慧!


博客正文:

一、Dota2参议院:策略博弈与模拟投票

场景描述:
Dota2参议院由两个阵营的参议员组成,Radiant(天辉)和Dire(夜魇)。每个参议员在每一轮中可以选择禁止另一个参议员的权利,或者宣布胜利(当所有有权利的参议员都来自同一阵营时)。我们需要模拟这个过程,预测最终获胜的阵营。

算法核心:队列模拟与策略优先
这个问题可以通过队列模拟和策略优先来解决。具体来说,我们可以将参议员按顺序加入队列,模拟每一轮的投票过程。在每一轮中,参议员可以禁止另一个参议员的权利,或者宣布胜利。

详细分析:

  1. 初始化队列:将所有参议员按顺序加入队列。
  2. 模拟每一轮投票:从队列中取出参议员,判断是否有权利投票。
    • 如果当前参议员的权利未被禁止,他可以选择禁止另一个参议员的权利。
    • 如果所有有权利的参议员都来自同一阵营,宣布胜利。
  3. 更新队列:将未被禁止权利的参议员重新加入队列,继续下一轮投票。

题目验证示例:

示例1:senate = "RD",输出为"Radiant"。

  • 第一轮:Radiant参议员禁止Dire参议员,队列中只剩下Radiant参议员。
  • 第二轮:Radiant参议员宣布胜利。

解释:
第 1 轮时,第一个参议员来自 Radiant 阵营,他可以使用第一项权利让第二个参议员失去所有权利。
这一轮中,第二个参议员将会被跳过,因为他的权利被禁止了。
第 2 轮时,第一个参议员可以宣布胜利,因为他是唯一一个有投票权的人。

示例2:senate = "RDD",输出为"Dire"。

  • 第一轮:Radiant参议员禁止第二个Dire参议员,第三个Dire参议员禁止Radiant参议员。
  • 第二轮:第三个Dire参议员宣布胜利。

解释:
第 1 轮时,第一个来自 Radiant 阵营的参议员可以使用第一项权利禁止第二个参议员的权利。
这一轮中,第二个来自 Dire 阵营的参议员会将被跳过,因为他的权利被禁止了。
这一轮中,第三个来自 Dire 阵营的参议员可以使用他的第一项权利禁止第一个参议员的权利。
因此在第二轮只剩下第三个参议员拥有投票的权利,于是他可以宣布胜利

#include <stdio.h>   // 标准输入输出库,提供printf、scanf等函数
#include <stdlib.h>  // 标准库,提供常用函数如内存分配
#include <string.h>  // 字符串处理库,提供strlen等函数#define MAX_SIZE 20000 // 定义队列最大容量,足够处理10000个参议员的多次轮次// 预测参议院投票获胜阵营的函数
char* predictPartyVictory(char* senate) {int n = strlen(senate); // 获取参议院字符串长度int r_queue[MAX_SIZE]; // 存储Radiant阵营参议员的索引队列int d_queue[MAX_SIZE]; // 存储Dire阵营参议员的索引队列int r_front = 0, r_rear = 0; // Radiant队列的头指针和尾指针int d_front = 0, d_rear = 0; // Dire队列的头指针和尾指针// 初始化队列:遍历参议院字符串,将参议员按阵营加入对应队列for (int i = 0; i < n; i++) {if (senate[i] == 'R') { // 如果是Radiant阵营r_queue[r_rear++] = i; // 将索引加入Radiant队列,尾指针后移} else { // 如果是Dire阵营d_queue[d_rear++] = i; // 将索引加入Dire队列,尾指针后移}}// 模拟投票过程:当两个队列都非空时继续循环while (r_front < r_rear && d_front < d_rear) {// 取出两队列队首的参议员索引int r_idx = r_queue[r_front]; // Radiant队首索引int d_idx = d_queue[d_front]; // Dire队首索引// 比较索引:索引小者优先行动(模拟投票顺序)if (r_idx < d_idx) { // Radiant参议员先行动d_front++; // 禁止Dire队首参议员(Dire队首出队)r_queue[r_rear++] = r_idx + n; // 当前Radiant参议员加入下一轮(索引加n重新入队)// Radiant参议员行动:// 1. 禁止Dire队首参议员(d_front++)// 2. 自身进入下一轮(索引加n后重新入队)} else { // Dire参议员先行动r_front++; // 禁止Radiant队首参议员(Radiant队首出队)d_queue[d_rear++] = d_idx + n; // 当前Dire参议员加入下一轮(索引加n重新入队)// Dire参议员行动:// 1. 禁止Radiant队首参议员(r_front++)// 2. 自身进入下一轮(索引加n后重新入队)}// 当前行动的参议员已处理完毕,从队列中移除r_front++; // Radiant队首出队(无论行动的是哪方,Radiant队首都需移除)d_front++; // Dire队首出队(无论行动的是哪方,Dire队首都需移除)}// 根据最终非空队列判断获胜阵营// 注意:这里比较的是尾指针和头指针,若Radiant队列非空则获胜return (r_rear > r_front) ? "Radiant" : "Dire";
}int main() {char senate[10001]; // 输入字符串缓冲区,预留结束符'\0'的空间printf("请输入参议院字符串(仅包含'R'和'D',长度<=10000): ");scanf("%s", senate); // 读取用户输入的参议院字符串char* result = predictPartyVictory(senate); // 调用预测函数printf("获胜阵营: %s\n", result); // 输出预测结果return 0; // 程序正常结束
}

输出结果;

二、递增的三元子序列:模式识别与高效判断

场景描述:
给定一个整数数组nums,判断是否存在长度为3的递增子序列。即是否存在下标i < j < k,使得nums[i] < nums[j] < nums[k]。

算法核心:贪心与双指针
这个问题可以通过贪心和双指针的方法来解决。具体来说,我们可以记录当前最小的前两个元素,然后在后续的遍历中寻找第三个更大的元素。

详细分析:

  1. 初始化变量:记录最小的前两个元素,分别为first和second。
  2. 遍历数组:对于每个元素num:
    • 如果num <= first,更新first。
    • 如果num > first且num <= second,更新second。
    • 如果num > second,返回true。
  3. 返回结果:如果遍历完整个数组仍未找到符合条件的三元组,返回false。

题目验证示例:

示例1:nums = [1,2,3,4,5],输出为true。

  • 递增三元组如(1,2,3)、(1,2,4)等。

示例2:nums = [5,4,3,2,1],输出为false。

  • 数组严格递减,不存在递增三元组。

示例3:nums = [2,1,5,0,4,6],输出为true。

  • 递增三元组如(0,4,6)。

 输出结果;

#include <stdio.h>      // 标准输入输出库,提供printf、scanf等函数
#include <stdbool.h>   // 提供bool类型及相关定义// 判断数组中是否存在递增的三元子序列的函数
bool increasingTriplet(int* nums, int numsSize) {// 如果数组长度小于3,不可能存在三元组,直接返回falseif (numsSize < 3) {return false;}// 初始化两个变量:int first = nums[0];    // 当前最小值的候选int second = 0;         // 第二小值的候选(初始值会被覆盖)bool hasSecond = false; // 标记second是否已被设置// 遍历数组,从第二个元素开始for (int i = 1; i < numsSize; i++) {int num = nums[i];  // 当前元素值// 如果已设置second且当前值大于second,找到三元组if (hasSecond && num > second) {return true;    // 直接返回true}// 如果当前值大于first,更新second(使其尽可能小)else if (num > first) {second = num;   // 设置second为当前值hasSecond = true; // 标记second已被设置}// 否则(当前值小于等于first),更新firstelse {first = num;    // 设置新的最小值候选}}// 遍历完成未找到三元组,返回falsereturn false;
}// 主函数
int main() {int nums[1000]; // 输入数组缓冲区(最大1000个元素)int n;          // 用户输入的数组长度// 获取用户输入printf("请输入数组长度(不超过1000): ");scanf("%d", &n); // 读取数组长度printf("请输入%d个整数(空格分隔): ", n);for (int i = 0; i < n; i++) {scanf("%d", &nums[i]); // 逐个读取数组元素}// 调用函数并输出结果bool result = increasingTriplet(nums, n);printf("结果: %s\n", result ? "true" : "false"); // 三目运算符输出结果return 0; // 程序正常结束
}


三、全方位对比:Dota2参议院 vs 递增的三元子序列

对比维度Dota2参议院递增的三元子序列
问题类型策略博弈、模拟投票模式识别、子序列判断
算法核心队列模拟、策略优先贪心、双指针
复杂度时间O(n^2),空间O(n)时间O(n), 空间O(1)
应用场景模拟投票过程、策略优化数组处理、模式识别
优化目标高效模拟投票过程,找到获胜阵营高效判断递增三元组是否存在

博客总结:

通过今天的分析,我们看到算法不仅仅是冰冷的代码,它还能帮助我们在策略博弈与模式识别中揭示隐藏的规律。无论是Dota2参议院,还是递增的三元子序列,背后的算法都在默默发挥作用,帮助我们找到最优解。

希望这篇文章能让你对这些算法问题有更深入的了解,也期待你在生活中发现更多有趣的场景,用算法的视角去探索它们!


博客谢言:

感谢你的耐心阅读!如果你觉得这篇文章有趣,不妨在评论区分享你生活中遇到的策略博弈或模式识别问题,或者你认为可以用算法优化的地方。让我们一起用算法的视角去探索数据的奥秘!


http://www.hkcw.cn/article/hPReCKmreL.shtml

相关文章

ShenNiusModularity项目源码学习(31:ShenNius.Admin.Mvc项目分析-16)

关键词管理页面用于新建、维护、删除、导入/导出系统CMS管理模块的关键词&#xff0c;关键词信息用于匹配CMS管理模块新建的文章内容中相同的信息&#xff0c;使其点击文章中的关键词时可以跳转到关键词关联的链接。关键词管理页面的后台控制器类KeywordController位于ShenNius…

ESP32-idf学习(三)esp32C3连接iot

一、前言 上一篇用蓝牙作为通信方式&#xff0c;虽然勉强完成了控制&#xff0c;但结果显然不是那么符合我们的预期&#xff0c;既然用蓝牙还需要研究一段时间&#xff0c;那我们就先整一些现成的&#xff0c;不需要研究的&#xff01;iot云平台&#xff01;这里当然也是通过w…

五芳斋陷多重困局 业绩下滑与库存压力增大

端午节期间,五芳斋面临了多重挑战。2024年公司营收和净利润双双下滑,分别下降超过14%,依然高度依赖粽子销售。市场方面,公司遭遇代工企业“蜜枣粽异物”风波,品牌形象受损。此外,公司给股东送粽子礼盒的举动被网友解读为清理库存,股价也连续下跌,5月30日更是收跌超7%。…

儿童节愿我们永葆童真 留住那份纯真好奇

今天是六一儿童节,每个孩子都会慢慢长大,而每个大人也都曾是孩子。在岁月的流逝中,那颗童心始终未变。愿我们永远保持童真和对这个世界的爱与好奇,快乐、灿烂、温暖、纯粹,一直可爱。责任编辑:zhangxiaohua

python里面导入yfinance的时候报错

我的代码&#xff1a; import yfinance as yf import os proxy http://127.0.0.1:7890 # 代理设置&#xff0c;此处修改 os.environ[HTTP_PROXY] proxy os.environ[HTTPS_PROXY] proxydata yf.download("AAPL",start"2010-1-1",end"2021-8-1&quo…

window桌面任务栏不见了鼠标移动底部无响应命令重启资源管理器无效解决办法

首先虽然重启是万能的&#xff0c;但是我不想重启啊大哥 以前喜欢用taskkill /f /im explorer 然后start explorerwindow11竟然没效果 ,所以ctrlaltdel 任务管理器 直接找到资源管理器右击重启&#xff0c;发现好了 {C44C69DC-D2BB-4E68-9F11-0AC2E2B5300B}.png 另外 ctrlwinsh…

Rollup打包输出产物遇到的一个坑。(分享心得)

文章目录 前言一、rollup的generateBundle钩子&#xff1f;二、遇到bug之前三、bug解决总结 前言 本人在学习过程中&#xff0c;发现一个基于vite的项目&#xff0c;在打包的过程中遇到了一个bug&#xff0c;就是我在学习开发一个vite插件功能&#xff0c;我需要获取到打包的产…

杭州一凶宅竞拍14轮后七五折成交 低价吸引买家

5月30日,杭州富阳区丁香花园蓝庭5号1703室房源在法拍平台上进行拍卖。该房源建成于2007年前后,建筑面积为200.73平方米,是一套东边套顶跃结构的房子。一层布局为二室三厅一厨二卫南北双阳台,二层则有一室(带书房、走入式衣柜)、一卫、一储藏室、一阳台和两露台。房子评估…

陈伟霆说张启山回来了 爷青回热议

2025年5月31日,电视剧《九门》正式官宣演员阵容及制作信息,在影视圈和粉丝群体中引发了广泛关注和热烈讨论。该剧由南派三叔担任原著及总监制,柏杉执导,优酷全网独播,强大的制作班底和引人入胜的剧情设定使其成为2025年最受期待的民国传奇剧之一。主演阵容方面,陈伟霆时隔…

樊振东回应加盟萨尔布吕肯 迎接新挑战

德甲联赛萨尔布吕肯乒乓球甲级俱乐部宣布,奥运冠军樊振东加盟。樊振东表示,他非常期待在萨尔布吕肯和德甲的新挑战,体验新的环境,并与球队一起赢得更多胜利。官宣声明发布后,莫雷加德也表示,能和樊振东成为队友感到很荣幸。责任编辑:zhangxiaohua

CSS专题之层叠上下文

前言 石匠敲击石头的第 15 次 在平常开发的时候&#xff0c;有时候会遇到使用 z-index 调整元素层级没有效果的情况&#xff0c;究其原因还是因为对层叠上下文不太了解&#xff0c;看了网上很多前辈的文章&#xff0c;决定打算写一篇文章来梳理一下&#xff0c;如果哪里写的有问…

Python实现P-PSO优化算法优化BP神经网络回归模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在当今数据驱动的时代&#xff0c;回归分析作为预测和建模的重要工具&#xff0c;在科学研究和工业应用中占据着重要…

07.概念三:LayerNorm和Softmax

参考视频&#xff1a;LayerNorm和Softmax概念 那我们第三部分的概念&#xff0c;也就是概念的最后一部分 关于LayerNorm和Softmax的概念、以及最后文字是怎么预测出来的 我们先来看一下这个layer normalization&#xff0c;简称layer norm层归一化。我觉得叫数字缩放&#xff0…

sglang0.4.3参数说明

执行命令&#xff1a; Python3 -m sglang.launch_server --model-path /mnt/data/models/DeepSeek-R1-Distill-Qwen-32B --host 172.26.*.* --port 9300 --tp 4 --trust-remote-code --served-model-name qwen32b 运行结果 响应速度 参数说明 model_path: 模型文件…

DeepSeek-R1-0528,官方的端午节特别献礼

DeepSeek&#xff1a;端午安康&#xff01;刻在国人骨子里的浪漫 2025 年 05 月 28 日 | DeepSeek 端午特别献礼 当粽叶飘香时&#xff0c;DeepSeek 悄然带来一份节日惊喜 版本号 DeepSeek-R1-0528 正式上线 官方赋予它的灵魂是&#xff1a; 思考更深 推理更强 用户通过官网…

莫雷加德说很荣幸成为樊振东队友 共同征战TTBL

当地时间5月31日,萨尔布吕肯乒乓球俱乐部宣布,乒乓球大满贯选手、巴黎奥运会乒乓球男单金牌得主樊振东将在下个赛季代表俱乐部参加德国乒乓球甲级联赛(TTBL)。目前效力于萨尔布吕肯俱乐部的乒乓球运动员、巴黎奥运会乒乓球男单银牌得主莫雷加德在社交媒体上表达了欢迎之情,…

人民日报:有车企说反内卷却打价格战 行业协会与工信部齐发声反对

中国汽车工业协会发布《关于维护公平竞争秩序,促进行业健康发展的倡议》,明确表示反对近期车企掀起的新一轮“价格战”。工信部也表态支持该倡议,强调“价格战”没有赢家。这一信号和态度有助于及时遏制无序的价格竞争。近年来,一些车企虽然口头上反对“内卷式”竞争,但实…

深入剖析Java类加载机制:双亲委派模型的突破与实战应用

引言&#xff1a;一个诡异的NoClassDefFoundError 某金融系统在迁移到微服务架构后&#xff0c;突然出现了一个诡异问题&#xff1a;在调用核心交易模块时&#xff0c;频繁抛出NoClassDefFoundError&#xff0c;但类明明存在于classpath中。经过排查&#xff0c;发现是由于不同…

在屈原的家乡端午节是什么样 三次端午持续近一月

端午节作为中国最古老的节日之一,其中以纪念屈原的习俗影响最为广泛。屈原出生于战国时期的湖北秭归,这里不仅保留着典型的屈原故里端午习俗,还有“端午比年大”的说法。在屈原的家乡湖北秭归乐平里,四面群山环抱,不远处是长江支流香溪河。据古籍记载,秭归“县北一百六十…

两条大鲵觅食迷路 警民接力救助 携手护送“水中熊猫”

5月29日10时许,湖北省襄阳市保康县的李先生和朋友在后坪镇五道峡附近的小河钓鱼时,意外发现了两条娃娃鱼。考虑到它们是野生保护动物,李先生立即报警求助。十分钟后,保康县公安局后坪派出所民警赶到现场。李先生激动地告诉民警:“我一看像是‘娃娃鱼’,就赶紧报了警,还是…