[算法题]田忌赛马(全排列简易解法)

田忌赛马

这道题遇到太多次了,受不了了,记录一下。

题目描述

给定两个只包含数字的数组a,b,调整数组 a 里面的数字的顺序,使得尽可能多的a[i] > b[i]。

数组a和b中的数字各不相同。

输出所有可以达到最优结果的a数组的结果。

输入描述

输入的第一行是数组 a 中的数字,其中只包含数字,每两个数字之间相隔一个空格,a数组大小不超过10。

输入的第二行是数组 b 中的数字,其中只包含数字,每两个数字之间相隔一个空格,b数组大小不超过10。

输出描述

输出所有可以达到最优结果的 a 数组的数量。

代码

// 题目描述
// 给定两个只包含数字的数组a,b,调整数组 a 里面的数字的顺序,使得尽可能多的a[i] > b[i]。// 数组a和b中的数字各不相同。// 输出所有可以达到最优结果的a数组的结果。// 输入描述
// 输入的第一行是数组 a 中的数字,其中只包含数字,每两个数字之间相隔一个空格,a数组大小不超过10。// 输入的第二行是数组 b 中的数字,其中只包含数字,每两个数字之间相隔一个空格,b数组大小不超过10。// 输出描述
// 输出所有可以达到最优结果的 a 数组的数量。// 获取一个数组的全排列
const getFullPermutation = (numList) => {const res = [];const track = [];// 记录已经使用过的数组const isVisited = [];const backTrack = (track, used) => {// 到达尽头if (track.length === numList.length) {res.push(track.concat());return;}for (let i = 0; i < numList.length; i++) {if (used[i]) {continue;}// 做选择track.push(numList[i]);used[i] = true;// 进入下一层决策树backTrack(track, used);// 撤销选择track.pop();used[i] = false;}};// 开始回溯backTrack(track, isVisited);return res;
};const getResult = (aList, bList) => {// 在这个排列模式下,a赢的个数const countAWin = (aCurList, bCurList) => {let res = 0;for (let i = 0; i < aCurList.length; i++) {if (aCurList[i] > bCurList[i]) {res++;}}return res;};// 获取全排列const aAllList = getFullPermutation(aList);console.log('aAllList: ', aAllList);let res = 0;// 最优情况数let maxAWinCase = 0;for (let i = 0; i < aAllList.length; i++) {const aWin = countAWin(aAllList[i], bList);console.log('aWin: ', aWin);if (aWin > maxAWinCase) {res = 1;maxAWinCase = aWin;} else if (aWin === maxAWinCase) {res++;}}return res;
};

优化

不记录全排列的路径,在做决策的时候就计算好,省空间复杂度

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;void (async function () {const a = (await readline()).split(" ").map(Number);const b = (await readline()).split(" ").map(Number);let maxBiggerCount = 0;let ans = 0;function dfs(level, used, biggerCount) {if (level >= a.length) {if (biggerCount > maxBiggerCount) {maxBiggerCount = biggerCount;ans = 1;} else if (biggerCount == maxBiggerCount) {ans += 1;}}for (let i = 0; i < a.length; i++) {if (used[i]) continue;used[i] = true;// biggerCount记录当前全排列中a[level] > b[level]的位置的数量, 此时a[level] == a[i]dfs(level + 1, used, biggerCount + (a[i] > b[level] ? 1 : 0));used[i] = false;}}dfs(0, new Array(a.length).fill(false), 0);console.log(ans);
})();

测试用例和输出结果

aAllList:  [[ 11, 8, 20 ],[ 11, 20, 8 ],[ 8, 11, 20 ],[ 8, 20, 11 ],[ 20, 11, 8 ],[ 20, 8, 11 ]
]
aWin:  2
aWin:  3
aWin:  1
aWin:  2
aWin:  2
aWin:  2
res:  1
--------------------
aAllList:  [[ 1, 2, 3 ],[ 1, 3, 2 ],[ 2, 1, 3 ],[ 2, 3, 1 ],[ 3, 1, 2 ],[ 3, 2, 1 ]
]
aWin:  0
aWin:  0
aWin:  0
aWin:  0
aWin:  0
aWin:  0
res1:  6
--------------------
aAllList:  [[ 11, 12, 20 ],[ 11, 20, 12 ],[ 12, 11, 20 ],[ 12, 20, 11 ],[ 20, 11, 12 ],[ 20, 12, 11 ]
]
aWin:  2
aWin:  3
aWin:  2
aWin:  3
aWin:  2
aWin:  2
res2:  2

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

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

相关文章

掌握SEO:如何优化用ChatGPT生成的文章以提升搜索排名

在数字化时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已经成为网站流量的重要来源。随着人工智能技术的进步&#xff0c;越来越多的人开始使用ChatGPT等AI工具来生成文章。然而&#xff0c;虽然这些工具可以快速生成内容&#xff0c;但要确保这些内容在搜索引擎中…

JS面试题1

1. 延迟加载JS有哪些方式&#xff1f; defer: 等html全部解析完成&#xff0c;才会执行js代码&#xff0c;顺次执行js脚本 async&#xff1a;是和html解析同步的&#xff0c;不是顺次执行js脚本&#xff08;当有很多个js时&#xff09;&#xff0c;是谁先加载完谁先执行。 <…

MK米客方德SD NAND磨损均衡技术

上次MK给大家讲解了MK SD NAND异常掉电保护机制&#xff0c;不少的工程师朋友们对此挺感兴趣&#xff0c;今天再和大家聊一聊SD NAND内部的另外一个核心技术SD NAND&#xff1a;磨损均衡&#xff08;Wear Leveling&#xff09;。 SD NAND内部主要由NAND Flash和Flash Controll…

Python操作MySQL数据库--使用pymysql模块

Python操作MySQL数据库--使用pymysql模块 一、新建数据库和数据表1.1 新建book数据库1.2 新建bookprice数据表二、连接数据库2.1 建立数据库连接三、新增数据3.1 新增单条数据3.2 新增多条数据3.3 批量新增四、修改数据4.1 修改单条数据4.2 修改多条数据五、删除数据5.1 删除单…

【Android Studio】Notification通知提醒功能完整代码以及踩坑记录

前言&#xff1a;在最近学习安卓通知功能的开发中&#xff0c;遇到了一些坑&#xff0c;困扰了我一些时间&#xff0c;搜集了大量资料写个博客总结一下&#xff0c;希望对大家有帮助。 目录 一、启动项目闪退 1.1、问题详情 1.2、解决方法 二、点击通知无法跳转 2.1、问题…

ONLYOFFICE8.1新版本桌面编辑器测评

什么是 ONLYOFFICE 文档 ONLYOFFICE 文档是一套功能强大的文档编辑器&#xff0c;支持编辑处理文本文档、电子表格、演示文稿、可填写的表单、PDF&#xff0c;可多人在线协作&#xff0c;支持 AI 集成。 该套件可在 Windows、Linux、Android 和 iOS上使用&#xff0c;包括网页…

最大团问题--回溯法

一、相关定义 给定一个无向图 &#xff0c;其中 V 是图的顶点集&#xff0c;E图的边集 完全图&#xff1a;如果无向图中的任何一对顶点之间都有边&#xff0c;这种无向图称为完全图 完全子图&#xff1a;给定无向图 &#xff0c;如果 &#xff0c;且对应任意 且 &#xff0c;则…

x264 码率控制 VBV 算法原理:数学模型与数据流转

x264 码率控制 VBV 算法原理 关于 VBV原理的分析可以参考:x264 码率控制 VBV 原理。关于 VBV 算法的源码分析可以参考:x264 码率控制中实现 VBV 算法源码分析。VBV算法介绍 x264中的VBV(Video Buffering Verifier)算法是H.264编码标准的一部分,主要用于码率控制,确保视频…

【CPP】交换排序:冒泡排序、快速排序

目录 1.冒泡排序简介代码分析 2.快速排序2.1霍尔版本简介代码分析 2.2挖坑版本2.3前后指针版本2.4非递归的快排思路代码 什么是交换排序&#xff1f; 基本思想&#xff1a;所谓 交换&#xff0c;就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置&#xff0…

Node.js 和浏览器环境中都使用 WebSocket

使用WebSocket为什么不适配双端 浏览器环境本身就支持 WebSocket&#xff0c;直接使用 JavaScript 内置的 WebSocket 对象来建立连接。 Node中本身并没有内置 WebSocket 协议的支持&#xff0c;所以需要使用第三方库 ws来实现 WebSocket 功能。 一. 使用跨平台 WebSocket 库 …

2.树莓派4b+ubuntu18.04(ros版本melodic)+arduino mega自制两轮差速小车,实现建图导航功能

这篇文章介绍arduino使用和安装arduino_bridge 将arduino与树莓派连接 查看arduino的端口号&#xff0c;我们这里查看到的时ttyUSB0 ll /dev/ttyUSB*将当前用户添加进dialout组 sudo usermod -a -G dialout your_user_name然后重启树莓派&#xff0c;然后才能生效 然后如果你…

PyCharm2024 for mac Python编辑开发

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff08;适合自己的M芯片版或Intel芯片版&#xff09;&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功3、打开访达&#xff0c;点击【文…

网络安全筑基篇——反序列化漏洞

目录 序列化是什么&#xff1f; 反序列化又是什么&#xff1f; 反序列化漏洞的危害 代码样例 常见的魔术方法 修复方式有哪些&#xff1f; 常见的反序列化漏洞 Shiro反序列化漏洞 Fastjson反序列化漏洞 序列化是什么&#xff1f; 将实例化对象转换成字节流的过程 反序…

Harmony OS UI框架探索笔记

本文探讨了如何将现有的常用架构理论与Arkts和ArkUI结合起来&#xff0c;使代码更有条理&#xff0c;并利用Previewer快速调整布局&#xff0c;同时在不改变代码的情况下运行显示真实数据。 开发环境 Windows 11DevEco Studio 4.0 ReleaseBuild Version: 4.0.0.600, built on…

机器人控制系列教程之URDF自动生成工具

URDF文件的编写较为复杂&#xff0c;ROS官方提供了URDF的SolidWorks插件&#xff0c;可方便地将 SW 零件和装配体导出为 URDF 文件。导出器将创建一个类似 ROS 的软件包&#xff0c;其中包含网格、纹理和机器人&#xff08;URDF 文件&#xff09;目录。对于单一的 SolidWorks 零…

API-回调函数

学习目标&#xff1a; 掌握回调函数 学习内容&#xff1a; 回调函数小结综合案例 回调函数&#xff1a; 如果将函数A做为参数传递给函数B时&#xff0c;我们称函数A为回调函数。 简单理解&#xff1a;当一个函数当作参数来传递给另外一个函数的时候&#xff0c;这个函数就是…

遗传编程(Genetic Programming, GP)和大规模语言模型(Large Language Models, LLMs)的相似之处

遗传编程&#xff08;Genetic Programming, GP&#xff09;和大规模语言模型&#xff08;Large Language Models, LLMs&#xff09;虽然在实现和用途上有所不同&#xff0c;但也有一些相似之处&#xff1a; 相似之处 自动化生成&#xff1a; GP&#xff1a;自动生成程序或表达…

DM达梦数据库函数分析(与oracle相应函数区别及用法分析)

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝💝💝如有需要请大家订阅我的专栏【数据库系列】哟!我会定期更新相关系列的文章 💝💝💝关注!关注!!请…

Python生成图形验证码

文章目录 安装pillow基本用法生成代码 安装pillow pip install pillow 基本用法 特殊字体文字 如下所示&#xff0c;将下载下来的ttf字体文件放到py文件同一文件夹下 分享一个免费下载字体网站&#xff1a;http://www.webpagepublicity.com/free-fonts.html 我选的字体是Baj…

探索AI的巅峰:详解GPT-3.5与GPT-4系列模型的区别

人工智能领域不断涌现出令人惊叹的技术突破&#xff0c;其中OpenAI的ChatGPT系列模型尤为引人注目。随着GPT-4的发布&#xff0c;技术开发者们对比分析其与前一代GPT-3.5的差异显得尤为重要。本文将深入探讨GPT-3.5和GPT-4系列模型的主要区别&#xff0c;帮助大家更好地理解和应…