A Super Hero
DP?
QwQ这题似乎不能直接贪心2333——
阶段
很明显的阶段性,\(n\)关便为\(n\)个阶段,
状态
分好阶段后,容易构造出状态的表达:
\(f[i,j]\)表示Ma5termind在最开始要带\(f[i,j]\)个子弹,才能打到第\(i\)关,并打倒第\(i\)关第\(j\)个敌人。
状态转移
Ma5termind在第\(i\)关获得的敌人的子弹只能使用到第\(i+1\)关。
可见当前状态是由上一个阶段(即\(i-1\))推过来的
于是我们得到这么个状态转移方程:
f[i,j]=min(f[i-1,k]|1 \leq k \leq n)&\text{当}b[i-1,k]>p[i,j]\\
f[i,j]=min(f[i-1,k]+p[i,j]-b[i-1,k]|1 \leq k \leq n) &\text{当}b[i-1,k] \leq p[i,j]
\end{cases}
\]
假的End
70分愉快的炸啦2333
优化?贪心?
没错,就是贪心啦
官方题解中用map和vector实现了一个很玄学的贪心,让我们来分析一下把!
因为\(p[i,j]\)是一个常数,于是我们可以把dp方程变为:
f[i,j]=min(f[i-1,k]|1 \leq k \leq n)&\text{当}b[i-1,k]>p[i,j]\\
f[i,j]=min(f[i-1,k]-b[i-1,k]|1 \leq k \leq n)+p[i,j] &\text{当}b[i-1,k] \leq p[i,j]
\end{cases}
\]
所以每个状态更新时就变成了最值查找啦,强行qsort就发挥作用啦!
然后我们就可以用接近\(O(m)\)的时间复杂度寻找更新状态啦。
我们使用map1存上一阶段的状态map,map2为当前阶段的map,
先考虑第二种情况
\]
一言不合上代码:
j:=1; k:=1; tmp:=maxlongint;
while j<=m do
begin
while (k<=m) and (map1_b[k]<=map2_p[j]) do
begin
tmp:=min(tmp,map1_f[k]-map1_b[k]);
inc(k);
end;
f[i,map2_j_num[j]]:=min(f[i,map2_j_num[j]],tmp+map2_p[j]);//别忘记加上常数p
inc(j);
end;
这个操作的时间复杂度忽略常数接近\(O(m)\),为什么是对的?
班门弄斧地证明一下2333,我们用类似数学归纳法的方法证明——
对于j
我们先称满足\(map1_b[k] \leq map2_p[j]\)在map1的\([1,k]\)区间为对于当前状态\(f[i,j]\)的最小满足区间
在这个区间里,那么因为是按照\(map1_b\)为关键字升序排序的,所以后面的\(map1_b[k]\)都会大于\(map2_p[j]\)
所以显然,当前检查到\([1,k]\)是对于当前状态\(f[i,j]\)的最小满足区间,那么这区间中最小的\(f[i-1,k]-b[i-1,k]\)(即\(tmp\))对于\(j\)是最优的 (满足条件\(b[i-1,k]<=p[i,j]\)情况下)
对于j+1?
又因为这个map2_p是按照升序,所以\(j+1\)的\(p\)是大于当前\(j\)的,
那么如果\(j+1\)时不更新\(k\),也就是说\(tmp\)不会变,这意味着\([1,k]\)也是他的最小满足区间,所以这个区间中最小值\(tmp\)也是对于\(j+1\)最优的 (满足条件\(p[i,j]>b[i-1,k]\)情况下)
如果更新的话,那就和对于j的情况是类似的啦,我们会继续找到最小满足区间然后更新。
类似的,对于第一种情况,我们也能按照类似这样的方法证明和更新状态,时间复杂度约为\(O(n\times m\times log_2^m)\),空间复杂度约为\(O(n \times m)\)
A Super Hero的更多相关文章
- JAVA 泛型通配符 ? EXTENDS SUPER 的用法
1. <? extends Hero> ArrayList heroList<? extends Hero> 表示这是一个Hero泛型或者其子类泛型heroList 的泛型可能 ...
- News Master-DC and Marvel they are super heroes mother
News Master Good evening everyone,I’m Jason,I’m glad to be news master to share something, Tonight I ...
- What's New in C# 6.0
Static Types as using So, we are all quite familiar with this notion of accessing static class membe ...
- 10 Ways to Inspire Your Team
Inspire. Just the word itself causes us to pause and think. We may remember our own personal heroes ...
- [Angular 2] Property Binding
Property Binding is bind property NOT attribute! import {Component, Input, Output, EventEmitter} fro ...
- What's New in C# 6.0(转)
原文地址:http://www.codeproject.com/Tips/1023426/Whats-New-in-Csharp 本来想翻译一下贴出来,但是好像很多语言组织起来比较困难,读书少不会表达 ...
- java基础(9) - 泛型解析
泛型 定义简单的泛型类 泛型方法 /** * 1.定义一个泛型类 * 在类名后添加类的泛型参数 <T> * 泛型类里面的所有T会根据创建泛型类时传入的参数确定类型 * 2.定义泛型方法 * ...
- JAVA设计模式--装饰器模式
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...
- java泛型基础、子类泛型不能转换成父类泛型
参考http://how2j.cn/k/generic/generic-generic/373.html 1.使用泛型的好处:泛型的用法是在容器后面添加<Type>Type可以是类,抽象类 ...
- Python基础7:字符串方法
1 * 重复输出字符串 print('helo '*4) 2 [],[:] 通过索引获取字符串中的字符,这里和列表中的切片操作是相同的,具体内容见列表 print('hello word'[2:]) ...
随机推荐
- OS-lab2
OS-lab2 启动之后,我们的操作系统要能运行,需要一个载体,就是内存.内存的访问不是直接的,而是通过MMU完成.在完成MMU之前,我们先看看一些需要用到的宏定义和函数. include pmap. ...
- VMware Workstation Ubuntu 20.04 LTS无法连接网络问题
本文记录了自己使用的安装在VMware Workstation上的Ubuntu20.04无法连接到网络的解决过程--终于解决困扰我两个小时的问题 出现问题# 毫无征兆,平时使用正常的Ubuntu在今天 ...
- VS2019使用Qt4.8.7
取消系统变量中的Qt_INCLUDEPATH_. C:\Users\octob\AppData\Local\QtMsBuild中添加qt4.natvis.xml,qt4.natvis for visu ...
- e网通公告
title:用户须知titleend<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \&qu ...
- ts(typescript)讲解for , for...in..., for...of..., while, every, some, map, filter
for 一般用于已知循环次数 var num:number = 5; var i:number; var factorial = 1; for(i = num;i>=1;i--) { fact ...
- MaaS模型即服务
chatgpt的API开放让我看到了科研和产业结合的一种方式, 最新的科研成果也能飞入百姓家了. 也看到了MaaS的未来,估计要出现一批提供在线模型的新创公司了.
- 解决 ant design vue Carousel 图片不能点击的问题
pointer-events: none 的作用如下: // 阻止用户的点击动作产生任何效果 // 阻止缺省鼠标指针的显示 // 阻止CSS里的hover和active状态的变化触发事件 // 阻止J ...
- freeradius + mysql安装配置
该文档参考http://t.zoukankan.com/FlyingPuPu-p-7772410.html安装,仅做了微调. 一.准备工作 安装编译FreeRadius所需要的依赖 #安装wget.g ...
- 解决Ubuntu下的的“system program problem detected”问题
解决Ubuntu下的的"system program problem detected"问题 1.删除crash文件 sudo rm /var/crash/*2.关闭pop up功 ...
- python 迁移虚拟环境
1.在源环境中获取包列表(新建文件夹whls) #cd 虚拟环境目录下的\scripts,cmd acitivate # 下载清单到requirements.txt,切换到whls目录 pip fre ...