题意

给定整数c和数组a,b,\(a_i\)表示通过爬楼梯的方法从第\(i\)层到\(i+1\)层需要的时间,\(b_i\)表示通过坐电梯的方法从第\(i\)层到\(i+1\)层需要的时间,坐电梯前需要等c单位时间。即对于\(i<j\),通过爬楼梯的方法要从第\(i\)层到第\(j\)层,需要\(\sum_i^{j-1}a_i\)的时间,而坐电梯需要\(c+\sum_i^{j-1}b_i\)的时间。

解题思路

很明显的dp题,首先考虑最简单的dp思路,对于每次层枚举他是从之前的那一层转移过来的,即

\[dp_j=\min \left\{ dp_i + \sum_i^{j-1}a_i,dp_i+c+\sum_i^{j-1}b_i\right\}
\]

这样dp的复杂度是\(O(n^2)\),显然会TLE,所以考虑优化一下

使用前缀和的方法后式子变为

\[dp_j=\min \left\{ dp_i + sa_{j-1}-sa_i,dp_i+c+sb_{j-1}-sb_i\right\}
\]

对于\(j\),可以将式子中的\(sa_{j-1}\)和\(sb_{j-1}\)视为常数,那么式子变为

\[dp_j=\min \left\{ \min\left\{dp_i - sa_i\right\} + sa_{j-1},\min \left\{dp_i - sb_i \right\}+c+sb_{j-1}\right\}
\]

记录\(dp_i - sa_i\)和\(dp_i - sb_i\)的最小值,每次更新即可,复杂度\(O(n)\)

AC代码

#include<bits/stdc++.h>
using namespace std; typedef long long ll;
const int maxn=2e5+5; int n,c,a[maxn],b[maxn];
ll dp[maxn]; int main()
{
scanf("%d %d",&n,&c);
for(int i=1;i<=n-1;i++)scanf("%d",&a[i]),a[i]+=a[i-1];
for(int i=1;i<=n-1;i++)scanf("%d",&b[i]),b[i]+=b[i-1];
ll A=0,B=0;
printf("%lld",dp[1]);
for(int i=1;i<=n-1;i++){
dp[i]=min(B+b[i]+c,A+a[i]); A=min(A,dp[i]-a[i]);
B=min(B,dp[i]-b[i]); printf(" %lld",dp[i]);
}
return 0;
}

Codeforces1249E By Elevator or Stairs?的更多相关文章

  1. [题解]Mail.Ru Cup 2018 Round 1 - A. Elevator or Stairs?

    [题目] A. Elevator or Stairs? [描述] Masha要从第x层楼去第y层楼找Egor,可以选择爬楼梯或者坐直升电梯.已知爬楼梯每层需要时间t1:坐直升电梯每层需要时间t2,直升 ...

  2. CodeForces1249E-By Elevator or Stairs?-好理解自己想不出来的dp

    Input The first line of the input contains two integers nn and cc (2≤n≤2⋅105,1≤c≤10002≤n≤2⋅105,1≤c≤1 ...

  3. Codeforces 1249 E. By Elevator or Stairs?

    传送门 首先显然下楼的操作一定是不优的,所以只要考虑上楼 设 $f[i]$ 表示到第 $i$ 层时需要的最少时间 那么首先考虑走楼梯,有转移,$f[i]=f[i-1]+a[i-1]$ 然后考虑坐电梯有 ...

  4. Codeforces 1249E By Elevator or Stairs? 题解

    这题其实和 NIKKEI 2019-2-D Shortest Path on a Line 差不多的啦,都是一种最短路的变形,把多个点和边关联了起来. 题面 你要从一楼到 \(n\) 楼去,每层楼可以 ...

  5. Mail.Ru Cup 2018 Round 1

    A. Elevator or Stairs? 签. #include <bits/stdc++.h> using namespace std; ]; int main() { while ...

  6. Codeforces Round #595 (Div. 3)

    A - Yet Another Dividing into Teams 题意:n个不同数,分尽可能少的组,要求组内没有两个人的差恰为1. 题解:奇偶分组. int a[200005]; void te ...

  7. dp(电梯与楼梯)

    http://codeforces.com/problemset/problem/1249/E E. By Elevator or Stairs? time limit per test 2 seco ...

  8. CF-595

    题目传送门 A .Yet Another Dividing into Teams sol:原先是用比较复杂的方法来解的,后来学弟看了一眼,发现不是1就是2,当出现两个人水平相差为1就分成两组,1组全是 ...

  9. BUAAOO P5-P7 Elevator Simulation

    目录 Abstract Introduction Topic Request Elevator Analysis Reading Requests Coordinating Scheduling an ...

随机推荐

  1. 面试被问:如果系统 CPU 突然飙升且 GC 频繁,你该如何排查?

    出自:开源中国 原文:系统运行缓慢,CPU 100%,以及Full GC次数过多问题的排查思路 处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题. ...

  2. json&pickle&shelve

    之前我们学习过用eval内置方法可以将一个字符串转成python对象,不过,eval方法是有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型的时候,eval就不管用了 ...

  3. Pytorch_第五篇_深度学习 (DeepLearning) 基础 [1]---监督学习与无监督学习

    深度学习 (DeepLearning) 基础 [1]---监督学习与无监督学习 Introduce 学习了Pytorch基础之后,在利用Pytorch搭建各种神经网络模型解决问题之前,我们需要了解深度 ...

  4. Nginx MogileFS 配置

    配置好MogileFS, 见mogilefs的安装与配置随笔 下载nginx.1.10.3.tar.gz, nginx_mogilefs_module.1.0.4.tar.gz 编译安装 将连个tar ...

  5. 《RabbitMQ》什么是死信队列

    一 什么是死信队列 当一条消息在队列中出现以下三种情况的时候,该消息就会变成一条死信. 消息被拒绝(basic.reject / basic.nack),并且requeue = false 消息TTL ...

  6. Coders' Legacy 2020 题解

    目录 Chef vs Doof Doof on Cartesian Doof fires Brackets Jeremy gets a gift Unique Substring Perry lear ...

  7. ALGEBRA-1 向量空间

    向量空间对加法封闭 对数乘封闭 直和:表示的唯一性

  8. C#LeetCode刷题之#441-排列硬币(Arranging Coins)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3995 访问. 你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状 ...

  9. C#LeetCode刷题之#167-两数之和 II - 输入有序数组(Two Sum II - Input array is sorted)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3903 访问. 给定一个已按照升序排列 的有序数组,找到两个数使得 ...

  10. Java学习之反射篇

    Java学习之反射篇 0x00 前言 今天简单来记录一下,反射与注解的一些东西,反射这个机制对于后面的java反序列化漏洞研究和代码审计也是比较重要. 0x01 反射机制概述 Java反射是Java非 ...