DP?

QwQ这题似乎不能直接贪心2333——

阶段

很明显的阶段性,\(n\)关便为\(n\)个阶段,

状态

分好阶段后,容易构造出状态的表达:

\(f[i,j]\)表示Ma5termind在最开始要带\(f[i,j]\)个子弹,才能打到第\(i\)关,并打倒第\(i\)关第\(j\)个敌人。

状态转移

Ma5termind在第\(i\)关获得的敌人的子弹只能使用到第\(i+1\)关。

可见当前状态是由上一个阶段(即\(i-1\))推过来的

于是我们得到这么个状态转移方程:

\[\begin{cases}
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

优化?贪心?

没错,就是贪心啦

官方题解中用mapvector实现了一个很玄学的贪心,让我们来分析一下把!

因为\(p[i,j]\)是一个常数,于是我们可以把dp方程变为:

\[\begin{cases}
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,

先考虑第二种情况

\[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]
\]

一言不合上代码:

  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的更多相关文章

  1. JAVA 泛型通配符 ? EXTENDS SUPER 的用法

    1. <? extends Hero> ArrayList heroList<? extends Hero> 表示这是一个Hero泛型或者其子类泛型heroList 的泛型可能 ...

  2. 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 ...

  3. 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 ...

  4. 10 Ways to Inspire Your Team

    Inspire. Just the word itself causes us to pause and think. We may remember our own personal heroes ...

  5. [Angular 2] Property Binding

    Property Binding is bind property NOT attribute! import {Component, Input, Output, EventEmitter} fro ...

  6. What's New in C# 6.0(转)

    原文地址:http://www.codeproject.com/Tips/1023426/Whats-New-in-Csharp 本来想翻译一下贴出来,但是好像很多语言组织起来比较困难,读书少不会表达 ...

  7. java基础(9) - 泛型解析

    泛型 定义简单的泛型类 泛型方法 /** * 1.定义一个泛型类 * 在类名后添加类的泛型参数 <T> * 泛型类里面的所有T会根据创建泛型类时传入的参数确定类型 * 2.定义泛型方法 * ...

  8. JAVA设计模式--装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...

  9. java泛型基础、子类泛型不能转换成父类泛型

    参考http://how2j.cn/k/generic/generic-generic/373.html 1.使用泛型的好处:泛型的用法是在容器后面添加<Type>Type可以是类,抽象类 ...

  10. Python基础7:字符串方法

    1 * 重复输出字符串 print('helo '*4) 2 [],[:] 通过索引获取字符串中的字符,这里和列表中的切片操作是相同的,具体内容见列表 print('hello word'[2:]) ...

随机推荐

  1. 原生js创建节点,添加节点,删除节点

    1.操作 var tab=document.querySelector('#app .bpm-container'); var abcbox=document.querySelector('.abcb ...

  2. Jenkins提供了哪些功能

    我的这篇文章仅仅是简单的根据上文,介绍Jenkins提供了哪些功能.具体大家还是要自己学习啦~ 官网首页就提供了windows版本的Jenkins安装包.我们可以下载一个用于学习.安装后自动打开htt ...

  3. 用requests-html和SelectorGadget轻松精准抓取网页数据

    我们在抓取网页数据时,最常採用Python的requests搭配BeautifulSoup的模式来完成.然而,requests-html整合了上述2个套件,又添加了新的功能,或许是抓取网页数据值得考虑 ...

  4. C语言源文件如何编译为exe

    先观看https://blog.csdn.net/u014772182/article/details/43348465来配置gcc环境随后在cmd中cd到目标文件夹gcc main.c -o ste ...

  5. Python170道面试题

    1. 谈谈对 Python 和其他语言的区别 答:Python 是一门语法简洁优美,功能强大无比,应用领域非常广泛,具有强大完备的第三方库,他是一门强类型的可移植.可扩展,可嵌入的解释型编程语言,属于 ...

  6. day1 AcWing 836. 合并集合

    初始化: n个下表对应n个集合,根节点的特征是父节点就是其本身. for(int i = 1; i <= n; i++) p[i] = i; M操作:如果两个元素在同一个集合中,什么也不做,否则 ...

  7. display和浮动

    display:block; // 块元素 display: inline-block //行内和块元素 浮动 float: left; 清除浮动 clear: both; 两侧不允许有浮动 解决父级 ...

  8. aws note

    Amazon EC2 Instance Types https://aws.amazon.com/ec2/instance-types/ My courses - AWS Skill Builder ...

  9. testtesttest

    test test       2022-09-24 #include<iostream> using namespace std; int main(){ cout<<&qu ...

  10. ssh 免密访问

    首先配置三台机器的hosts文件 填写需要配置的三台主机ip,然后命名,这里我写的时 t1 t2 t3 三台机器上都要配置hosts文件,要配置一样. 三台机器改完后保存退出 ping一下刚才配置的三 ...