2023-02-15:商场中有一展柜A,其大小固定,现已被不同的商品摆满,
商家提供了一些新商品B,需要对A中的部分商品进行更新替换,
B中的商品可以自由使用,也就是可以用B中的任何商品替换A中的任何商品,
A中的商品一旦被替换,就认为消失了!而不是回到了B中!
要求更新过后的展柜中,商品严格按照价格由低到高进行排列,
不能有相邻商品价格相等的情况,
A[i]为展柜中第i个位置商品的价格,B[i]为各个新商品的价格。
求能够满足A中商品价格严格递增的最小操作次数,若无法满足则返回-1。

答案2023-02-15:

动态规划。从左往右模型。

代码用rust编写。代码如下:

fn main() {
let mut a1 = vec![1, 8, 3, 6, 9];
let mut b1 = vec![1, 3, 2, 4];
println!("{}", min_swaps(&mut a1, &mut b1));
let mut a1 = vec![4, 8, 3, 10, 5];
let mut b1 = vec![1, 3, 2, 4];
println!("{}", min_swaps(&mut a1, &mut b1));
let mut a1 = vec![1, 8, 3, 6, 9];
let mut b1 = vec![4, 3, 1];
println!("{}", min_swaps(&mut a1, &mut b1));
} // 可以用B里的数字,替换A里的数字,想让A严格递增
// 返回至少换几个数字
fn min_swaps(aa: &mut Vec<i32>, bb: &mut Vec<i32>) -> i32 {
// 根据题意,B里的数字随意拿
// 所以B里的数字排序,不会影响拿
// 同时,A如果从左往右考虑,依次被B替换上去的数字,肯定是从小到大的
// 这是一定的!比如B = {5,3,2,9}
// 可能先用5替换A的某个左边的数,再用2替换A的某个右边的数吗?不可能
// 所以将B排序
bb.sort();
let ans = process(aa, bb, 0, 0, 0);
return if ans == i32::MAX { -1 } else { ans };
} // 参数解释:
// A[0...ai-1]范围上已经做到升序了
// 接下来请让A[ai....]范围上的数字做到升序
// 之前的过程中,B里可能已经拿过一些数字了
// 拿过的数字都在B[0...bi-1]范围上,不一定都拿了
// 但是最后拿的数字一定是B[bi-1]
// 如果想用B里的数字替换当前的A[ai],请在B[bi....]范围上考虑拿数字
// pre : 表示之前的A[ai-1]被替换了没有,
// 如果pre==0,表示A[ai-1]没被替换
// 如果pre==1,表示A[ai-1]被替换了,被谁替换的?被B[bi-1]替换的!
// 返回值:让A[ai....]范围上的数字做到升序,最少还要在B[bi...]上拿几个数字
// 如果返回值是Integer.MAX_VALUE,表示怎么都做不到
// 这就是一个三维动态规划,自己改!
// ai 是N范围
// bi 是M范围
// pre 只有0、1两种值
// 所以时间复杂度O(N*M*logM)
// 这个logM怎么来的,二分来的,看代码!
fn process(aa: &mut Vec<i32>, bb: &mut Vec<i32>, ai: i32, bi: i32, pre: i32) -> i32 {
if ai == aa.len() as i32 {
return 0;
}
// 之前的数是什么
let pre_num: i32;
if ai == 0 {
pre_num = i32::MIN;
} else {
if pre == 0 {
pre_num = aa[(ai - 1) as usize];
} else {
pre_num = bb[(bi - 1) as usize];
}
}
// 可能性1,搞定当前的A[ai],不依靠交换
let p1 = if pre_num < aa[ai as usize] {
process(aa, bb, ai + 1, bi, 0)
} else {
i32::MAX
};
// 可能性2,搞定当前的A[ai],依靠交换
let mut p2 = i32::MAX;
// 在B[bi....]这个范围上,找到>preNum,最左的位置
// 这一步是可以二分的!因为B整体有序
let near_more_index = bs(bb, bi, pre_num);
if near_more_index != -1 {
let next2 = process(aa, bb, ai + 1, near_more_index + 1, 1);
if next2 != i32::MAX {
p2 = 1 + next2;
}
}
return get_min(p1, p2);
} fn get_min<T: Clone + Copy + std::cmp::PartialOrd>(a: T, b: T) -> T {
if a < b {
a
} else {
b
}
} // 在B[start....]这个范围上,找到>num,最左的位置
fn bs(bb: &mut Vec<i32>, start: i32, num: i32) -> i32 {
let mut ans = -1;
let mut l = start;
let mut r = bb.len() as i32 - 1;
let mut m: i32;
while l <= r {
m = (l + r) / 2;
if bb[m as usize] > num {
ans = m;
r = m - 1;
} else {
l = m + 1;
}
}
return ans;
}

2023-02-15:商场中有一展柜A,其大小固定,现已被不同的商品摆满, 商家提供了一些新商品B,需要对A中的部分商品进行更新替换, B中的商品可以自由使用,也就是可以用B中的任何商品替换A中的任何的更多相关文章

  1. MySQL中同时存在创建和更新时间戳字段解决方法浅析

    MySQL中同时存在创建和更新时间戳字段解决方法浅析 明确我的MySQL版本.mysql> SELECT VERSION();+------------+| VERSION() |+------ ...

  2. celery介绍、架构、快速使用、包结构,celery执行异步、延迟、定时任务,django中使用celery,定时更新首页轮播图效果实现,数据加入redis缓存的坑及解决

    今日内容概要 celery介绍,架构 celery 快速使用 celery包结构 celery执行异步任务 celery执行延迟任务 celery执行定时任务 django中使用celery 定时更新 ...

  3. [2017.02.15] 《C++Primer5》 复习笔记

    编程语言主要是提供一个框架,用计算机能够处理的方式来表达问题的解决方法. 自定义数据类型class的基本思想是数据抽象dataabstraction和封装encapsulation.数据抽象是一种依赖 ...

  4. mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法

    [CSDN下载] Powerdesigner 设计主键code不能重复等问题 [CSDN博客] Oracle中用一个序列给两个表创建主键自增功能的后果 [CSDN博客] MySQL自增主键删除后重复问 ...

  5. JPA中自定义的插入、更新、删除方法为什么要添加@Modifying注解和@Transactional注解?

    前几天,有个同事在使用JPA的自定义SQL方法时,程序一直报异常,捣鼓了半天也没能解决,咨询我的时候,我看了一眼他的程序,差不多是这个样子的: @Repository public interface ...

  6. .NET 6 Preview 3 中 ASP.NET Core 的更新和改进

    原文:bit.ly/2Qb56NP 作者:Daniel Roth 译者:精致码农-王亮 .NET 6 预览版 3 现已推出,其中包括许多对新的 ASP.NET Core 改进.以下是本次预览版的新内容 ...

  7. 如何规避MyBatis使用过程中带来的全表更新风险

    作者:京东零售 贾玉西 一.前言 程序员A: MyBatis用过吧? 程序员B: 用过 程序员A: 好巧,我也用过,那你遇到过什么风险没?比如全表数据被更新或者删除了. 程序员B: 咔,还没遇到过,这 ...

  8. 分布式系统中一些主要的副本更新策略——Dynamo/Cassandra/Riak同时采取了主从式更新的同步+异步类型,以及任意节点更新的策略。

    分布式系统中一些主要的副本更新策略. 1.同时更新 类型A:没有任何协议,可能出现多个节点执行顺序交叉导致数据不一致情况. 类型B:通过一致性协议唯一确定不同更新操作的执行顺序,从而保证数据一致性 2 ...

  9. Winfrom中ListBox绑定List数据源更新问题

    Winfrom中ListBox绑定List数据源更新问题 摘自:http://xiaocai.info/2010/09/winform-listbox-datasource-update/ Winfr ...

  10. Mysql数据库中的计数器表实时更新

    如果某个应用中存在计数器,例如网站的总访问量.用户的粉丝数.文件下载数等等.如果相关应用在Mysql数据库的表中保存计数器,在更新计数器的时候可能会碰到并发问题.例如在web应用中,记录网站的点击次数 ...

随机推荐

  1. 替代if esle 的高级方法

    if else 是入门最常遇到的一种结构,这种结构简单易懂,深受初学者喜爱.但是 If-Else通常是一个糟糕的选择. 它的可读性差,如果用的太多,会导致结构重构困难.今天我就介绍替代 If-Else ...

  2. Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'hive.DELETEME1643159643943' doesn't exist

    Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'hive.DELETEME1643159643 ...

  3. element表格样式修改

    HTML代码: <el-table :data="tableData" style="width: 100%" border :row-class-nam ...

  4. java代码审计-SpEL表达式注入

    0x01 前言 Spring Expression Language(简称 SpEL)是一种功能强大的表达式语言.用于在运行时查询和操作对象图:语法上类似于Unified EL,但提供了更多的特性,特 ...

  5. 给我一块画布,我可以造一个全新的跨端UI

    一.源起   作者是名超大龄程序员,曾涉及了包括Web端.桌面端.移动端等各类前端技术,深受这些前端技术的苦,主要但不限于: 每种技术编写代码的语言及技术完全不同,同样呈现形式的组件各端无法通用: 大 ...

  6. svn提交规范

    本文档参考了Git提交规范,旨在规范使用SVN进行代码版本管理时的提交操作. 提交前的准备 1. 检查代码 在提交代码前,请先进行必要的代码检查,确保代码的正确性.可读性和可维护性.可以使用代码质量管 ...

  7. Kattis mapcolouring(状压dp)

    刚知道vj上查看别人代码,看不到汉字...我理解的都注明后边了. #include <bits/stdc++.h> #define ll long long #define met(a, ...

  8. Linux & 标准C语言学习 <DAY9_1>

        2.函数传参:         1.函数中定义的变量属于该函数,出了该函数就不能再被别的函数直接使用         2.实参与形参之间是以赋值的方式进行传递数据的,并且是单项值传递     ...

  9. 2021 技术展望丨AV1 在 RTC 应用实践中的现状与展望

    线上会议.在线教育.电商直播等多个场景的兴起,也使得实时互动技术从幕后走到台前,得到了更多人的关注.编解码.网络传输.计算机视觉等 RTE 相关的一系列技术也正焕发出更强的生命力.2021 年,在深度 ...

  10. 设计模式(二十八)----综合应用-自定义Spring框架-Spring简单回顾

    1 spring使用回顾 自定义spring框架前,先回顾一下spring框架的使用,从而分析spring的核心,并对核心功能进行模拟. 数据访问层.定义UserDao接口及其子实现类 public ...