当前位置: 首页 > news >正文

1919C. Grouping Increases

问题描述

序列 X X X,划分成两个字序列 A , B A,B A,B,其中惩罚是 A , B A,B A,B之中, A [ i ] < A [ i + 1 ] , B [ i ] < B [ i + 1 ] A[i] < A[i+1], B[i] < B[i+1] A[i]<A[i+1],B[i]<B[i+1]的个数

思路

  1. 拆分 X X X,实际上是个在线的过程,不断的从 X X X中拿数字往 A , B A,B A,B之中填。

  2. 我们假设 A , B A,B A,B的最后一个数字为 A l , B l A_l,B_l Al,Bl, 针对元素 X [ i ] X[i] X[i]的插入,下列三种情况进行不同的讨论,不失一般性,我们假设 A l < = B l A_l <= B_l Al<=Bl
    情况1: X [ i ] < = A l X[i] <= A_l X[i]<=Al
    X [ i ] X[i] X[i] A A A里,因为 B l B_l Bl可接受的范围一定更广泛

    情况2: X [ i ] > B l X[i] > B_l X[i]>Bl
    X [ i ] X[i] X[i] A A A里,因为添加到 B B B的末尾,会损失一个大一点的数字

    情况3: A l < X [ i ] < = B l A_l < X[i] <= B_l Al<X[i]<=Bl
    X [ i ] X[i] X[i] B B B里,不论到A和B得会到一个负分,该决策优于添加到A,这个在文末证明。

代码

void solve()
{int n;cin >> n;vector<int> v(n + 1);for (int i = 1; i <= n; i++){cin >> v[i];}int a, b;a = b = INT_MAX;int penalty = 0;for (int i = 1; i <= n; i++){if (a > b) // a <= b{swap(a, b);}if (v[i] <= a){a = v[i];}else if (v[i] <= b){b = v[i];}else{penalty++;a = v[i];}}cout << penalty << "\n";
}

证明

情况3我们可以比较两种决策,
决策1:插入A
决策2:插入B

决策2的收益来的比较短,比如下面这种场景
A : [ 3 ] A:[3] A:[3]
B : [ 8 ] B:[8] B:[8]
X [ i ] = 5 X[i] = 5 X[i]=5

A : [ 3 ] A:[3] A:[3]
B : [ 8 , 5 ] B:[8, 5] B:[8,5]

如果我们下一个数字 X [ i + 1 ] X[i+1] X[i+1]为7,就得到1点负面收益
A : [ 3 , 7 ] A:[3, 7] A:[3,7]
B : [ 8 , 5 ] B:[8, 5] B:[8,5]


决策1的收益在与后期,比如:

A : [ 3 ] A:[3] A:[3]
B : [ 8 ] B:[8] B:[8]
X [ i ] = 5 X[i] = 5 X[i]=5

A : [ 3 , 5 ] A:[3, 5] A:[3,5]
B : [ 8 ] B:[8] B:[8]

如果我们下一个数字 X [ i + 1 ] X[i+1] X[i+1]为7,那么我们决策1就会得到收益
A : [ 3 , 5 ] A:[3,5] A:[3,5]
B : [ 8 , 7 ] B:[8, 7] B:[8,7]

但是如果我们下个数字大于8, 或者小于等于5,我们决策2和决策1会等价,并且决策2会少一点penalty。

比较上面情况, 决策2全方面的大于决策1

证毕

其实可以通过直觉得到结论,因为如果保留 B l B_l Bl,添加到 A A A里,由于每个数字都只受相邻影响,所以 B l B_l Bl的收最多就1。

http://www.lryc.cn/news/509871.html

相关文章:

  • Pion WebRTC 项目教程
  • 【安全编码】Web平台如何设计防止重放攻击
  • VUE3+django接口自动化部署平台部署说明文档(使用说明,需要私信)
  • Python爬虫(入门+进阶)
  • 保姆级教程Docker部署RabbitMQ镜像
  • 【RAII | 设计模式】C++智能指针,内存管理与设计模式
  • Linux复习3——管理文件系统2
  • c++---------数据类型
  • 前端Python应用指南(三)Django vs Flask:哪种框架适合构建你的下一个Web应用?
  • 鸿蒙系统文件管理基础服务的设计背景和设计目标
  • 要查询 `user` 表中 `we_chat_open_id` 列不为空的用户数量
  • AI科研助手开发总结:向量与数据权限的应用(二)
  • python爬虫----爬取视频实战
  • HarmonyOS NEXT 实战之元服务:静态案例效果--航空出行
  • DP83848以太网移植流程,可以TCP通信
  • css 裁剪 clip-path
  • MySQL用表组织数据
  • 细说STM32F407单片机轮询方式读写SPI FLASH W25Q16BV
  • C++-------指针
  • Linux文件目录 --- 移动和改名命令MV、强制移动、试探性移动过、按时间移动
  • 03.HTTPS的实现原理-HTTPS的工作流程
  • vue实现批量下载文件流并压缩
  • 前端入门之VUE--ajax、vuex、router,最后的前端总结
  • 安装k8s涉及命令(方便放到txt离线使用)
  • FLV视频封装格式详解
  • 搭建vue3+vant项目架构
  • 【Linux】进程间通信 -> 匿名管道命名管道
  • 大数据开发学习路线
  • 华为云计算HCIE笔记05
  • wordpress网站用token登入开发过程