CF936D World of Tank(思维dp)

problem

洛谷链接

solution

有一种 dpdpdp 并不常见。其主要思想大概就是积累后再支出 / 先预支后再填充。

本题就是积累后再支出。显然炮冷却好了后就一直处于可用状态,玩没玩过游戏的都知道一冷却好就打一定不会劣于等一会再打,因为这道题的炮也没有射程限制。

我们可以很容易地设计出一个状态转移 dp:f[i][j]:dp:f[i][j]:dp:f[i][j]: 在第 iiijjj 列时的最多冷却时间。

从状态设计来看。虽然是走到了障碍物才开炮(减去冷却时间),但在实际操作中一定是非常前面的某个冷却好的时刻开的炮,远距离炸了这个障碍物。

f[i][j]=max⁡{min⁡(f[i⊕1][j],t),f[i][j−1]+1}f[i][j]=\max\{\min(f[i\oplus 1][j],t),f[i][j-1]+1\}f[i][j]=max{min(f[i1][j],t),f[i][j1]+1}

换道之所以要跟 tttmin⁡\minmin,是因为我们知道累计的时间都只能炸同行的后面障碍物,一旦换道就非常现实,一开始最多就积累武器冷却好的 ttt 秒,多了的也不能用到不同的道。且要保证 f[i⊕1][j]f[i\oplus 1][j]f[i1][j] 没有障碍物,

不换道,必须满足 f[i][j]f[i][j]f[i][j] 有障碍物的时候,目前的积累时间能够射击一次。

到目前为止似乎可行,但是很遗憾 nnn 的范围高达 1e91e91e9。根本开不出这么大的数组。

考虑一种换道的方式。假设现在在 (i,j)(i,j)(i,j),而 (i⊕1,j)(i\oplus 1,j)(i1,j) 有障碍,且现在要换道。

我是在 (i,j+1)(i,j+1)(i,j+1) 时候就换道,还是再走一段 (i,j+k),k>1(i,j+k),k>1(i,j+k),k>1 再换道。

显然是要换道就立马换。因为立即换道明显可以积累更多的可用时间。越晚换道积累的时间都是本道才可用的,换道后能用的时间越少。

即在障碍物后要换道就直接换。

由此看来,真正有用的关键点就是起点,终点,障碍物及障碍物后一个格子的位置。

就可以将 nnn 直接离散化压缩到 m1+m2m_1+m_2m1+m2 的级别。

输出状态就要在转移的时候记录是否改为变道,以便最后的路径倒推。

时间复杂度 O(m1+m2)O(m_1+m_2)O(m1+m2)

code

#include <bits/stdc++.h>
using namespace std;
#define maxn 2000005
vector < int > tran;
vector < pair < int, int > > fire;
int n, m1, m2, t, cnt;
int x1[maxn], x2[maxn], x[maxn];
int f[2][maxn], g[2][maxn], p[2][maxn];int main() {scanf( "%d %d %d %d", &n, &m1, &m2, &t );for( int i = 1;i <= m1;i ++ ) {scanf( "%d", &x1[i] );x[++ cnt] = x1[i];x[++ cnt] = x1[i] + 1;}for( int i = 1;i <= m2;i ++ ) {scanf( "%d", &x2[i] );x[++ cnt] = x2[i];x[++ cnt] = x2[i] + 1;}x[++ cnt] = 0, x[++ cnt] = 0x7f7f7f7f; //将有用的关键点离散化sort( x + 1, x + cnt + 1 );cnt = unique( x + 1, x + cnt + 1 ) - x - 1;for( int i = 1;i <= m1;i ++ )p[0][lower_bound( x + 1, x + cnt + 1, x1[i] ) - x] = 1;for( int i = 1;i <= m2;i ++ )p[1][lower_bound( x + 1, x + cnt + 1, x2[i] ) - x] = 1;//标记有障碍坐标对应的离散化点memset( f, -1, sizeof( f ) );g[1][1] = 1, f[0][1] = f[1][1] = 0;//如果从第一行开始 就证明已经换车道了for( int i = 1;i <= cnt;i ++ ) {for( int k = 0;k <= 1;k ++ )if( ~ f[k][i] and ! p[k ^ 1][i] ) { //考虑换车道 要求另一车道没有障碍if( f[k ^ 1][i] < min( f[k][i], t ) ) {f[k ^ 1][i] = min( f[k][i], t ); //最多只能储存tg[k ^ 1][i] = 1; //=1 换车道记录}}for( int k = 0;k <= 1;k ++ )if( ~ f[k][i] and f[k][i] + x[i + 1] - x[i] - 1 >= t * p[k][i + 1] ) {//不换车道考虑同车道的下一个关键点是否是障碍物//下一个关键点到当前关键还能再积累 x[i+1]-x[i]-1 的能量//-1是因为此时不能拿到x[i+1]位置的一个能量//必须保证先能下一位置障碍物击破才能+1 所以下面+1就把-1抵消了if( f[k][i + 1] < f[k][i] + x[i + 1] - x[i] - t * p[k][i + 1] ) {f[k][i + 1] = f[k][i] + x[i + 1] - x[i] - t * p[k][i + 1];g[k][i + 1] = 0;}}}int px;if( f[0][cnt] < f[1][cnt] ) px = 1;else px = 0;if( ! ~f[px][cnt] ) return ! printf( "No\n" );else printf( "Yes\n" );int py = cnt, now = 0x3f3f3f3f;while( px or py > 1 ) {if( g[px][py] ) {tran.push_back( x[py] );px ^= 1;}else {if( p[px][py] ) {now = min( now - t, x[py] - 1 );//因为是倒着推操作方案 所以now是后一个机器最晚必须射击的时间//now-t就是为了正着时后面的障碍物着想//只有这个时候射击 才能给机器足够的冷却时间去设计更后面的障碍物fire.push_back( make_pair( now, px + 1 ) );}py --;}}printf( "%d\n", tran.size() );for( int i = tran.size() - 1;~ i;i -- ) printf( "%d ", tran[i] );printf( "\n%d\n", fire.size() );for( int i = fire.size() - 1;~ i;i -- ) printf( "%d %d\n", fire[i].first, fire[i].second );return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 中的Async 和 Await 的用法详解

众所周知C#提供Async和Await关键字来实现异步编程。在本文中&#xff0c;我们将共同探讨并介绍什么是Async 和 Await&#xff0c;以及如何在C#中使用Async 和 Await。同样本文的内容也大多是翻译的&#xff0c;只不过加上了自己的理解进行了相关知识点的补充&#xff0c;如果你…

AtCoder4515 [AGC030F] Permutation and Minimum(dp)

problem 洛谷链接 solution 一个 AiA_iAi​ 只会影响一个 BiB_iBi​&#xff0c;BiB_iBi​ 之间的决定因素 AAA 是不会有交的。 所以如果相邻两个对同一个 BiB_iBi​ 影响的 A2i,A2i−1A_{2i},A_{2i-1}A2i​,A2i−1​ 都是确定的&#xff0c;那么 BiB_iBi​ 也就确定了。 …

Tree Xor(未完全搞定)

Tree Xor 题意&#xff1a; 一颗有n个点的树&#xff0c;边权给出&#xff0c;第i个节点的权值为Wi&#xff0c;但并不知道Wi&#xff0c;只知道Wi在[Li,Ri]&#xff0c;边权等于两端点的异或值 问W序列有多少可能 题解&#xff1a; 如果我们知道一个点的值&#xff0c;就可…

Docker的部署-包括网关服务(Ocelot)+认证服务(IdentityServer4)+应用服务

本文主要介绍通过Docker来部署通过.Net Core开发的微服务架构&#xff0c;部署的微服务主要包括统一网关&#xff08;使用Ocelot开发&#xff09;、统一认证&#xff08;IdentityServer4&#xff09;、应用服务&#xff08;asp.net core web api&#xff09;&#xff1b;本文不…

AtCoder3950 [AGC022E] Median Replace(DFA + dp)

problem solution 可以从 DFA\text{DFA}DFA 的思想来考虑这道题。 考虑建一个 DFA\text{DFA}DFA 只接受最后可以变成字符串 111 的原串。 因为每次是选择三个 连续/相邻 的位置操作&#xff0c;限制是比较强的&#xff0c;无非有三种情况。 case1 三个全 111&#xff0c;操…

Minimum grid

Minimum grid 题意&#xff1a; 一个n * n的矩阵&#xff0c;有m个位置需要填数&#xff0c;填的数的范围是0<k<1e6,需要满足第i行的最大值是b&#xff0c;第j列的最大值是ci&#xff0c;求一个满足条件的最小代价 n<2e3,m<8e5,k<1e6 题解&#xff1a; 如果…

ASP.NET Core 实战:使用 Docker 容器化部署 ASP.NET Core + MySQL + Nginx

一、前言在之前的文章&#xff08;ASP.NET Core 实战&#xff1a;Linux 小白的 .NET Core 部署之路&#xff09;中&#xff0c;我介绍了如何在 Linux 环境中安装 .NET Core SDK / .NET Core Runtime、Nginx、MySQL&#xff0c;以及如何将我们的 ASP.NET Core MVC 程序部署到 Li…

AtCoder 4169 [ARC100D] Colorful Sequences(dp)

problem 洛谷链接 solution 逆向考虑。ansansans 所有蛋糕中的 aaa 序列出现次数 −-− 在 non−colorfulnon-colorfulnon−colorful 蛋糕中的出现次数。 在所有蛋糕中的出现次数&#xff0c;即 (n−m1)⋅kn−m(n-m1)k^{n-m}(n−m1)⋅kn−m&#xff0c;枚举 aaa 序列开头的…

VS2017 无法连接到Web服务器“IIS Express”终极解决方案

今天日了gou了&#xff0c;一大早打开VS2017的时候出现无法连接到Web服务器“IIS Express”的错误&#xff0c;然后必应了一下&#xff0c;再谷歌了一下找到的解决方法也都千篇一律&#xff0c;奈何都没能解决&#xff0c;最后通过静下心来的思考&#xff0c;尝试解决了问题&am…

CodeForces 1361E James and the Chase(dfs + 结论)

problem 洛谷链接 solution 看到这个 20%20\%20% 的特殊性质&#xff0c;脑海里第一个就想到了随机化算法。已经PTSD了着实上头 如果本题只是随便求一个 interesting\text{interesting}interesting 的点&#xff0c;那就非常简单了。 随机化一个点&#xff0c;检查这个点是…

2021牛客暑期多校训练营4

2021牛客暑期多校训练营4 题号题目知识点ACourseBSample GameCLCSDRebuild TreeETree Xor思维线段树FJust a jokeGProductHConvolutionIInverse PairJAverage

Docker最全教程之使用.NET Core推送钉钉消息(二十)

前言上一篇我们通过实战分享了使用Go推送钉钉消息&#xff0c;由于技痒&#xff0c;笔者现在也编写了一个.NET Core的Demo&#xff0c;作为简单的对照和说明。最后&#xff0c;由于精力有限&#xff0c;笔者希望有兴趣的朋友可以分享下使用CoreRT将.NET Core编译成机器代码这块…

[线性代数学习笔记] 线性递推数列及 Berlekamp-Massey 算法的详细推导过程

线性递推数列 线性递推 对于无限数列 {a0,a1,...}\{a_0,a_1,...\}{a0​,a1​,...} 和有限非空数列 {r0,r1,...,rm−1}\{r_{0},r_1,...,r_{m-1}\}{r0​,r1​,...,rm−1​} 。 若对于任意 m−1≤nm-1\le nm−1≤n &#xff0c;有 ∑i0m−1an−iri0\sum_{i0}^{m-1}a_{n-i}r_i0∑…

Average

Average 题意&#xff1a; 矩阵W的值可以通过数组a和b得到&#xff0c;W[i][j]a[i]b[j],现在求W的一个子矩阵&#xff0c;平均值最大&#xff0c;且子矩阵必须满足宽度至少是x&#xff0c;高度至少是y&#xff0c;计算最大平均值 题解&#xff1a; 那答案就变成了分别对a和b…

开箱即用Bumblebee独立部署搭建webapi网关详解

在之前的章节里都是讲述如何在程序中使用Bumblebee来构建一个Webapi网关&#xff1b;但这样显然有些麻烦&#xff0c;毕竟很多时候可能只需要一个简单负载处理&#xff0c;还需要写个程序针对服务进行编写代码或配置的确是比较麻烦的事情&#xff1b;如果有负载方面的调整还需要…

LCS(2021牛客多校4)

LCS(2021牛客多校4) 题意&#xff1a; 让你构造三个字符串s1,s2,s3&#xff0c;长度均为n,要求LCS(s1,s2)a,LCS(s2,s3)b,LCS(s1,s3)c 题解&#xff1a; 先考虑三个串互相LCS为x,y,z,且x>y>z 显然如果xy-n>z则无解&#xff0c;反之xy-n<z有解 那么就先给三个串加…

CodeForces 1616H Keep XOR Low {a^b≤x} / CodeForces gym102331 Bitwise Xor {a^b≥x}(trie树 + 计数)

文章目录CodeForces 1616H Keep XOR LowproblemsolutioncodeCodeForces gym102331 Bitwise XorproblemsolutioncodeCodeForces 1616H Keep XOR Low problem 洛谷链接 solution 虽然选的是一个子集&#xff0c;但本质还是二元限制。 这非常类似以前做过的题目&#xff0c;已…

ASP.NET Core 文件系统

静态文件 目录浏览 默认页面 MIME类型配置 实战文件服务器 紧接上一讲 中间件 之后&#xff0c;今天来我们来讲一下关于 ASP.NET Core 中静态文件服务。什么是静态文件&#xff1f;先看一下下面例子&#xff08;在客户端浏览器中通过 url 路径访问了网站的一张图片&#xff09…

[C++] iota语句的语法

头文件为 numeric #include <numeric> using namespace std;语法和 sort / lower_bound / upper_bound 等差不多&#xff0c;都是前闭后开的原则。 iota(Ax,Ay,z) &#xff1a;表示将 AAA 数组的 [x,y)[x,y)[x,y) 区间进行填充&#xff0c;从 zzz 开始&#xff0c;每填…

如何使用vs将asp.net core项目添加容器支持并发布docker镜像到私有dockerhub和添加k8s/helm管理...

这篇文章介绍一下&#xff0c;如何使用VS2017给asp.net core添加容器支持&#xff0c;并发布镜像到私有docker hub&#xff0c;然后用chart管理容器镜像的操作流程。话不多说&#xff0c;just do it.新建项目首先新建一个asp.net core项目&#xff0c;这里我新建一个WebApi默认…