皇后游戏1

news2024/11/15 12:36:08

先把这个推导看完




现在我们来讲一下总结

首先,我们要观察到 c i c_i ci递增,这样才能更简单,就不用像国王游戏那样在交换前后比较 i i i j j j的max了(就是说,国王游戏需要比较 m a x ( c i , c j ) max(c_i,c_j) max(ci,cj) m a x ( c j ′ , c i ′ ) max(c_j^{'},c_i^{'}) max(cj,ci),但是这道题目就只用比较 c j c_j cj c i ′ c_i^{'} ci

然后,这道题目教会了我们如果去掉max中的max(或min中的min):先把外层max外面的项全部移动到外层max里面,然后再对内层max进行类似的操作,最终就可以只保留一个max了

那么为什么这道题目能够消掉 y + b i + b j y+b_i+b_j y+bi+bj呢?其实就像题解里面说的,数学上是肯定错误的,但是对于这类题目(注意是这类题目,不是这道题目,至于这类是哪一类,见本文最后)是都可以消去的

我们考虑最终的⑤式,如果我们最终的序列满足⑤式,那么肯定是可以推导到①式上面的那一个式子的,那么对这个式子,我们给两个max里面都加上 y + b i + b j y+b_i+b_j y+bi+bj,肯定也是成立的,而这就是我们最开始推导的那一个式子

就是说,我们按照这种排序规则排序后,最开始的式子就能够被推导出来,就不会出现交换相邻两项出现更优的情况

所以以后遇到这种题,如果是 m a x ( a 1 , a 2 , a 3 , . . . . ) ≤ m a x ( b 1 , b 2 , b 3 , . . . . ) max(a_1,a_2,a_3,....)≤max(b_1,b_2,b_3,....) max(a1,a2,a3,....)max(b1,b2,b3,....),如果存在 i i i j j j,使得 a i = b j a_i=b_j ai=bj,我们直接消去这两项即可

然后我们根据这个式子排序(注意cmp函数里面不要加等于号,stl的排序都不要加)后模拟即可

但是,有一个很自然的问题:最终的排序一定是最优的吗?

就是说,最优排序一定满足这个条件,但是满足这个条件的一定是最优排序吗?

答案是否定的

比如下面:

7 3
1 1
1 6

然而还有一种排序也满足条件:

1 1
1 6
7 3

但是前者算出来17,后者算出来12

怎么解决?

首先明白一个定理:任何一个序列都可以通过有限次邻项交换变成任何另一个序列

我们这个时候回到国王游戏这一道题目

这一道题目按照 a i × b i ≤ a i + 1 × b i + 1 a_i \times b_i ≤ a_{i+1} \times b_{i+1} ai×biai+1×bi+1排序,那么中间会存在一些乘积相等的数(就是这个序列被分成了若干个块,每个块之间的乘积严格递增,但是块内的乘积相等),那么最优答案不可能会在块之间进行交换,因为答案会变差(当然最优序列也必须满足以上条件,就是说如果想通过交换邻项去得到更优的情况,一定是在块内交换的),然而在块内交换,由于乘积都相等,每一次交换答案都不变,所以我们任意找一个满足条件的序列就可以了

我们思考一下上面的排序有何特殊的地方:每一个关键字都只跟自身元素有关,而不是像⑤式一样跟前后两项都有关

就是说,如果关键字只跟自身有关,那么排序后关键字肯定就具有传递性,在同一块内任意交换,由于具有传递性,就会导致答案不变,所以任何一个序列都满足题目

这里传递性主要是去满足接下来说的“消除逆序对”。我们通过邻项交换证明出来一个不等式,如果这个不等式没有被满足,就是存在“逆序对”

那么回到皇后游戏,我们要想办法把⑤式变成只跟自身有关的式子,由于只跟自身有关系,所以我们按照每个大臣 a a a b b b的大小进行讨论

一旦当我们按照上述方法排序后,这个序列是满足⑤式的,每个块中(一共有三个组,每个组里面有若干个块)任意交换都不会改变答案(也可以证明块间交换答案不会更优)

比如在第一组内,交换 i i i i + 1 i+1 i+1,其中 a i = a i + 1 a_i=a_{i+1} ai=ai+1

d = m a x ( c i − 1 , ∑ j = 1 i a j ) d=max(c_{i-1},\sum_{j=1}^{i} a_j) d=max(ci1,j=1iaj)

交换前:因为 d ≥ ∑ j = 1 i a j , b i > a i d≥\sum_{j=1}^{i} a_j,b_i>a_i dj=1iaj,biai,则有 m a x ( d + b i , ∑ j = 1 i a j + a i + 1 ) + b i + 1 = d + b i + b i + 1 max(d+b_i,\sum_{j=1}^{i} a_j + a_{i+1})+b_{i+1}=d+b_i+b_{i+1} max(d+bi,j=1iaj+ai+1)+bi+1=d+bi+bi+1

交换后:因为 b i + 1 > a i + 1 = a i b_{i+1}>a_{i+1}=a_i bi+1ai+1=ai,则有 m a x ( d + b i + 1 , ∑ j = 1 i a j + a i + 1 ) + b i = d + b i + b i + 1 max(d+b_{i+1},\sum_{j=1}^{i} a_j + a_{i+1})+b_{i}=d+b_i+b_{i+1} max(d+bi+1,j=1iaj+ai+1)+bi=d+bi+bi+1

所以前后不变

最后还有一些想说的

我们最开始化出来的⑤式,其实是不能保证最优结果一定符合的,因为这个式子不只是跟自身元素有关,我们只能说明如果不符合这个式子,我们交换后结果不可能变差,然而也可能不会变好,然后我们经过无限次交换都不能消除这个逆序,这完全是可能的

然而通过这个式子,我们推导出了最后的排序方案,这个方案只跟自身元素有关了,于是,我们就可以统计逆序对,这题的逆序对定义为:若 i < j i<j ij i i i的大组 > j >j >j的大组或者 i i i j j j是同一个组但是两者不符合组内的排序条件,那么 ( i , j ) (i,j) (i,j)就是一个逆序对

我们先来考虑最优答案会不会存在有关大组的逆序对,也就是说,我们给每个人分组, a < b a<b a<b的是第一组, a = b a=b a=b的是第二组, a > b a>b a>b的是第三组,假设我们已经获得了一个最优的排序了,这个排序是不可能存在大组编号逆序对的(比如 i < j i<j i<j i i i的大组 > j >j >j的大组,光看大组编号的话,这个逆序对关系显然具有传递性,因为组的编号也只跟自身 a a a b b b的相对大小有关,于是有逆序对就一定有相邻逆序对,即 i i i的大组 > i + 1 >i+1 >i+1的大组,我们交换 i i i i + 1 i+1 i+1就可以消除一个大组逆序对,可以证明答案不会变差)

经过上面的分析,最终的最优答案一定不会包含大组逆序对,我们再对每个大组进行排序,通过类似分析也可以消除剩下的逆序对(这个逆序对就不是大组逆序对了,因为前面大组逆序对已经被消除了,这个逆序对是 i i i j j j是同一个组但是两者不符合组内的排序条件的逆序对,很显然这个逆序对也有传递性,因为此时第一维 a a a已经固定了,我们只用看与自身有关的第二维 b b b就好了),从而得到最终的序列(注意最终的序列在块内随意交换答案都不变了,所以我们随便找一个最终的序列就好了,这一定是最优的序列)

为什么我们最开始要以 a a a b b b的相对大小作为划分依据呢?应该是经验吧,而且此时注意,这样一定会分出大组,对于其他类似的题目,我们都像上面这样分析,即先考虑消除大组逆序对,再考虑消除组内逆序对

我们再回头看看国王游戏,如果已经找到了一个最优方案而且这个最优方案有逆序对,那么可以通过相同的方法消除所有逆序对来得到一种最优方案

所以总结一下这类题目:给你一个序列,每个元素有若干个属性,让你对这个序列任意排序,使得最大量最小或者最小量最大,那么就可以通过领项交换先得出一种最优式子,如果这个式子与前后两项有关(比如皇后游戏),想办法化作只与自身有关,然后就可以利用逆序对的传递性来解决问题了

update 2024.7.21

重新做的时候做出来了,但是解释新发现了一个疑问(幸好立马解决了):这里列式子只考虑了邻项,但是后面的 c c c也可能会因为前面的 c c c的变化而变化,为什么不用考虑?实际上,显然对于后面的 c c c来说,前面的 c c c越小越好,所以我们最后搞出来了一个充分条件,让 c c c尽量小就好了

前面说的可以去掉 y + b i + b j y+b_i+b_j y+bi+bj,实际上就是在找充分条件。数学上进行消元找的都是充要条件,但是这里我们做题只用找出充分条件。当然有些时候消掉相同项也不是说就能找出充分条件了,但是我们可以这么尝试一下,如果能够尝试出来,就可以通过消掉相同项化简

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

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

相关文章

酒店管理系统(C语言)

系统分析 本系统分为以下6大模块&#xff1a;顾客登记模块、查询顾客信息模块、查询空房间模块、预订房间模块、退订房间模块、保存并退出模块&#xff0c;如下图所示。 1. 顾客结构体 2. 主菜单的设计及实现 3. 登记顾客模块的实现 4. 查询顾客信息功能的实现 5. 查询空房间功…

ubuntu系统vscode调试c/c++大中型项目

文章目录 1. 插件2. 项目工程3. vsode的配置setting.jsonc_cpp_properties.json 4. 启动调试 前置阅读 vscode调试第一篇 1. 插件 c/c, cmake, cmake tools 2. 项目工程 对于我的项目需要用到很多的三方库&#xff0c;三方库的版本又会有很多&#xff0c;一般都是用cmake编译…

建图,链式前向星,拓扑排序

建图&#xff0c;链式前向星&#xff0c;拓扑排序 建图的三种方式1.邻接矩阵2.邻接表3.链式前向星 拓扑排序练习题-课程表字典序最小的拓扑排序拓扑排序模板题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 例题1.火星字典2.戳印序列 建图的三种方式 1.邻接矩阵 …

485,Modbus,开关量,UART,I2C,4-20mA,0-5V,TTL接口区别

工业和电子通信中最常见的几种类型&#xff0c;它们在数据传输方式、信号类型、通信协议、应用领域和物理特性上有所不同。下面分别解释这些接口的区别&#xff1a; 1. RS-485 类型&#xff1a;半双工差分信号传输。用途&#xff1a;用于长距离、多点通信场合&#xff0c;如楼…

Redis--12--1--分布式锁---java

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Redis与分布式锁Jedis实现1.RedisConfig2.RedisDistLock3.应用4.加上看门狗逻辑 RedisDistLockWithDog redisson实现1.依赖2.代码 Redis与分布式锁 Jedis实现 1.Re…

spring security如何适配盐存在数据库中的密码

19.token认证过滤器代码实现_哔哩哔哩_bilibili19.token认证过滤器代码实现是SpringSecurity框架教程-Spring SecurityJWT实现项目级前端分离认证授权-挑战黑马&尚硅谷的第20集视频&#xff0c;该合集共计41集&#xff0c;视频收藏或关注UP主&#xff0c;及时了解更多相关视…

【学习笔记】无人机系统(UAS)的连接、识别和跟踪(六)-无人机直接C2通信

目录 引言 5.4 直接C2通信 5.4.1 概述 5.4.2 A2X直接C2通信服务的授权策略 5.4.3 USS使用A2X直接C2通信服务的C2授权程序 5.4.4 直接C2通信建立程序 引言 3GPP TS 23.256 技术规范&#xff0c;主要定义了3GPP系统对无人机&#xff08;UAV&#xff09;的连接性、身份识别…

手动构建线性回归(PyTorch)

import torch from sklearn.datasets import make_regression import matplotlib.pyplot as plt import random #1.构建数据 #构建数据集 def create_dataset():x,y,coefmake_regression(n_samples100,n_features1,random_state0,noise10,coefTrue,bias14.5)#将构建数据转换为张…

AI大模型的风过去了?不,是离我们越来越近了

OpenAI摊牌了。不再掩藏锋芒&#xff0c;拿年初预测的2亿美元收入做挡箭牌&#xff0c;“我们的年营收达到了13亿美元。”10月中旬Sam Altman终于透露出来。13亿美元&#xff0c;同比增长4500%。 国内。资本和公众的视线越来越多地放在局势变幻、芯片和造车上。 △三季度融资行…

学习系列一:YOLO系列目标检测框架之间介绍及对比

YOLO系列目标检测框架之间介绍及对比 华为HCIP AI高级工程师证书&#xff0c; 华为HCIA AI证书&#xff0c;目前从事视觉算法工作 文章目录 YOLO系列目标检测框架之间介绍及对比前言一、YOLOv1二、YOLOv2三、YOLOv3四、YOLOv4五、YOLOv5及后续算法 前言 YOLO系列算法 YOLO 创…

《0基础》学习Python——第十七讲__正则表达式(requests)

一、什么是正则表 正则表达式是一种用于匹配和操作字符串的强大工具。它可以用于检索、替换和验证字符串。正则表达式使用特定的语法来描述字符串的模式&#xff0c;然后用于查找符合该模式的字符串。 在Python中&#xff0c;可以使用re模块来使用正则表达式。re模块提供了一组…

启动流程和切换流程

启动流程 #mermaid-svg-iUWGw8xl1SyAmoo9 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-iUWGw8xl1SyAmoo9 .error-icon{fill:#552222;}#mermaid-svg-iUWGw8xl1SyAmoo9 .error-text{fill:#552222;stroke:#552222;}#…

3D培训大师创新培训体验,加速空调关键组件的高效精准安装

如今&#xff0c;空调系统的复杂性和精密性与日俱增&#xff0c;对专业技术人员的要求也日益提高。尤其是决定空调是否能平稳运行的空调关键组件的装配培训&#xff0c;不再局限于传统的理论讲解和实体模型演示&#xff0c;而是更注重数字化、沉浸式学习。 案例背景 某空调公…

代码随想录算法训练营Day26 | 491.递增子序列 | 46.全排列 | 47.全排列 II | 332.重新安排行程 | 51.N皇后 | 37.解数独

今日任务 491.递增子序列 题目链接&#xff1a; https://leetcode.cn/problems/non-decreasing-subsequences/description/题目描述&#xff1a; Code class Solution { public:vector<vector<int>> findSubsequences(vector<int>& nums) {vector&l…

[PM]数据分析

概览 数据的定义 运营数据 分析的目的 数据分析流程 1.明确目标 2.数据来源 3.采集数据 4.数据整理 5.数据分析 趋势分析 当数据出现异常&#xff0c;一般从3个角度去查找问题&#xff1a; 1.技术层面&#xff0c;是不统计出错&#xff0c;或者产品出现bug 工 2.产品层面&am…

haproxy服务介绍

haproxy 搭建使用开启HAProxy的界面UI配置负载均衡配置web代理 HAProxy&#xff08;High Availability Proxy&#xff09;是一个高性能的TCP/HTTP负载均衡器和代理服务器&#xff0c;广泛用于提升Web应用的可用性和性能。[官网说明](https://docs.haproxy.org/2.8/intro.html#3…

羊大师:户外狂欢羊奶滋养,年轻人的活力养生新潮流

在这个快节奏的时代&#xff0c;年轻人正以他们独有的方式&#xff0c;重新定义着健康与养生的概念。他们深知&#xff0c;气血不足不应是青春的代名词&#xff0c;而应是活力四射的前奏。于是&#xff0c;一群年轻人以“发癫式”打卡的创意方式&#xff0c;将户外活动的乐趣推…

[保姆级教程]uniapp安装使用uViewUI教程

文章目录 创建 UniApp 项目下载uView UI下载安装方式步骤 1: 安装 uView UI步骤 2: 查看uView UI是否下载成功步骤 3: 引入 uView 主 JS 库步骤 4: 引入 uView 的全局 SCSS 主题文件步骤 5: 引入 uView 基础样式步骤 6: 配置 easycom 组件模式注意事项 NPM方式步骤 1: 安装 uVi…

跟代码执行流程,读Megatron源码(二)训练入口pretrain_gpt.py

Megatron-LM默认支持GPT、T5、BERT等多个常见模型的预训练&#xff0c;当下大模型流行&#xff0c;故以pretrain_gpt.py为例做源码的走读。 一. 启动pretrain_gpt.py pretrain_gpt.py为GPT类模型的训练入口&#xff0c;它通过命令行形式被调用&#xff0c;其精确执行路径位于M…

n7.Nginx 第三方模块

Nginx 第三方模块 第三模块是对nginx 的功能扩展&#xff0c;第三方模块需要在编译安装Nginx 的时候使用参数–add-modulePATH指定路径添加&#xff0c;有的模块是由公司的开发人员针对业务需求定制开发的&#xff0c;有的模块是开 源爱好者开发好之后上传到github进行开源的模…