皇后游戏1

先把这个推导看完




现在我们来讲一下总结

首先,我们要观察到 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,实际上就是在找充分条件。数学上进行消元找的都是充要条件,但是这里我们做题只用找出充分条件。当然有些时候消掉相同项也不是说就能找出充分条件了,但是我们可以这么尝试一下,如果能够尝试出来,就可以通过消掉相同项化简

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

获取本地时间(Linux下,C语言)

一、函数 #include <time.h> time_t time(time_t *tloc);函数功能&#xff1a;获取本机时间&#xff08;以秒数存储&#xff0c;从1970年1月1日0:0:0开始到现在&#xff09;。返回值&#xff1a;获得的秒数&#xff0c;如果形参非空&#xff0c;返回值也可以通过传址调用…

政安晨【零基础玩转各类开源AI项目】基于Ubuntu系统部署Hallo :针对肖像图像动画的分层音频驱动视觉合成

目录 背景介绍 训练与推理 训练 推理 开始部署 1. 把项目源码下载到本地 2. 创建 conda 环境 3. 使用 pip 安装软件包 4. 下载预训练模型 5. 准备推理数据 6. 运行推理 关于训练 为训练准备数据 训练 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞…

操作系统(3)——内存管理

目录 小程一言专栏链接: [link](http://t.csdnimg.cn/6grrU)内存管理无存储器抽象存储器抽象实现以下几方面小结 虚拟内存实现以下方面总结 页面置换算法概述常见的页面置换算法先进先出&#xff08;FIFO&#xff09;算法最近最少使用&#xff08;LRU&#xff09;算法总结 小程…

list(链表)容器的规则及list的高级排序案例

1.list的基本概念&#xff1a; 功能&#xff1a;将数据进行链式存储 list&#xff08;链表&#xff09;是一种物理存储单元上非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接实现的 链表是由一系列节点组成&#xff0c;节点的组成包含存储数据元素的…

【保卫花果山】游戏

游戏介绍 拯救花果山是一款玩家能够进行趣味闯关的休闲类游戏。拯救花果山中玩家需要保护花果山的猴子&#xff0c;利用各种道具来防御妖魔鬼怪的入侵&#xff0c;游戏中玩家需要面对的场景非常的多样&#xff0c;要找到各种应对敌人的方法。拯救花果山里玩家可以不断的进行闯…

huawei USG6001v1学习----NAT和智能选路

目录 1.NAT的分类 2.智能选路 1.就近选路 2.策略路由 3.智能选路 NAT:&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09; 指网络地址转换&#xff0c;1994年提出的。NAT是用于在本地网络中使用私有地址&#xff0c;在连接互联网时转而使用全局…

在win10上通过WSL和docker安装Ubuntu子系统,并配置Ubuntu可成功使用宿主机GPU

本文主要记录win10系统上,通过WSL的Ubuntu系统以及Docker使用GPU的全部过程。 文章目录 1、 启用hyper-v2、 安装docker3、 安装WSL3.1 安装WSL23.1.1 检查是否安装了WSL23.1.1 安装和配置 WSL 23.2 安装Ubuntu 子系统3.3 检查并修改WSL版本4、docker配置ubuntu20.04 LTS5、下…

C语言函数:编程世界的魔法钥匙(2)-学习笔记

引言 注&#xff1a;由于这部分内容比较抽象&#xff0c;而小编我又是一个刚刚进入编程世界的计算机小白&#xff0c;所以我的介绍可能会有点让人啼笑皆非。希望大家多多包涵&#xff01;万分感谢&#xff01;待到小编我学有所成&#xff0c;一定会把这块知识点重新介绍一遍&a…

零基础STM32单片机编程入门(十五) DHT11温湿度传感器模块实战含源码

文章目录 一.概要二.DHT11主要性能参数三.DHT11温度传感器内部框图四.DTH11模块原理图五.DHT11模块跟单片机板子接线和通讯时序1.单片机跟DHT11模块连接示意图2.单片机跟DHT11模块通讯流程与时序 六.STM32单片机DHT11温度传感器实验七.CubeMX工程源代码下载八.小结 一.概要 DH…

ubuntu20.04支持win10远程桌面连接

1. 安装xrdp sudo apt install xrdp 2. 检查xrdp状态 sudo systemctl status xrdp 要处于running状态 3.&#xff08;若为Ubuntu 20&#xff09;添加xrdp至ssl-cert sudo adduser xrdp ssl-cert 4. 重启服务 sudo systemctl restart xrdp 5. window 远程桌面连接&am…

“信息科技风险管理”和“IT审计智能辅助”两个大模块的部分功能详细介绍:

数字风险赋能中心简介 数字风险赋能中心简介 &#xff0c;时长05:13 大家好&#xff01;我是AI主播安欣&#xff0c;我给大家介绍一下数字风险赋能中心。 大家都知道当前我国政企机构的数字化转型已经进入深水区&#xff0c;数字化转型在给我们带来大量创新红利的同时&#xf…

【BUG】已解决:requests.exceptions.ProxyError: HTTPSConnectionPool

已解决&#xff1a;requests.exceptions.ProxyError: HTTPSConnectionPool 目录 已解决&#xff1a;requests.exceptions.ProxyError: HTTPSConnectionPool 【常见模块错误】 原因分析 解决方案 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&am…

PostgreSQL创建表和自增序列

一、创建表&#xff1a; 注意&#xff1a; 1、在mysql没有序列的概念&#xff0c;id自增通过auto_increment实现&#xff1b; 2、pgsql没有auto_increment的概念&#xff0c;如何实现id自增&#xff1f;有两种方式&#xff1a; 方式一&#xff1a;创建序列&#xff0c;绑定…

Flink HA

目录 Flink HA集群规划 环境变量配置 masters配置 flink-conf.yaml配置 测试 Flink HA集群规划 FLink HA集群规划如下&#xff1a; IP地址主机名称Flink角色ZooKeeper角色192.168.128.111bigdata111masterQuorumPeerMain192.168.128.112bigdata112worker、masterQuorumPee…

Django 请求和响应

1、请求 &#xff08;1&#xff09;get请求 用户直接在浏览器输入网址&#xff0c;参数直接在url中携带 http://127.0.0.1:8000/login/?a1&b%221243%22 &#xff08;2&#xff09;post请求 在html使用post,login.html <!DOCTYPE html> <html lang"en&…

SpringBoot框架学习笔记(三):Lombok 和 Spring Initailizr

1 Lombok 1.1 Lombok 介绍 &#xff08;1&#xff09;Lombok 作用 简化JavaBean开发&#xff0c;可以使用Lombok的注解让代码更加简洁Java项目中&#xff0c;很多没有技术含量又必须存在的代码&#xff1a;POJO的getter/setter/toString&#xff1b;异常处理&#xff1b;I/O…

java学习---小项目---租房系统

package com.project.House_rental.HouseApp;import com.project.House_rental.HouseView.HouseView; //主界面 public class HouseApp {public static void main(String[] args) {new HouseView().List_();System.out.println("------已退出----------");} }package…

PostgreSQL 中如何解决因大量并发删除和插入操作导致的索引抖动?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 PostgreSQL 中如何解决因大量并发删除和插入操作导致的索引抖动一、理解索引抖动二、索引抖动的影响三…

Postgresql主键自增的方法

Postgresql主键自增的方法 一.方法&#xff08;一&#xff09; 使用 serial PRIMARY KEY 插入数据 二.方法&#xff08;二&#xff09; &#x1f388;边走、边悟&#x1f388;迟早会好 一.方法&#xff08;一&#xff09; 使用 serial PRIMARY KEY 建表语句如下&#xf…

react中组件间的通信

一、父传子 1.代码展示 import React, { useState } from react;function SonPage(props){ // 子组件const {msg} propsreturn (<div>我是子组件 {msg}</div>) }function App() { // 父组件const [msgText,setMsgText] useState(父传子)return (<div classN…