AGC 007D.Shik and Game(DP)
\(Description\)
数轴上有一个人,从\(0\)出发到\(E\),速度为\(1\)。数轴上还有\(n\)只熊,每只熊会在经过后的\(T\)时刻后产生一个金币。给定\(E,T\)以及\(n\)个熊的坐标\(p_i\),求收集完所有金币并到达\(E\)的最短时间。
\(n\leq10^5,\quad E,T\leq10^9\)。
\(Solution\)
令\(f_i\)表示当前\(1\sim i\)只熊的金币已经收集完,且现在在\(p_i\)处的最短时间。
每次一定是路过一段的熊,然后回去吃完金币再回到\(i\)。
那么有:$$f_i=\min{f_j+p_i-p_j+\max{T,\ 2(p_i-p_{j+1})}}$$
其实\(p_i-p_j\)这一部分是必走的(就是从\(0\)到\(E\)),不需要考虑,可以最后直接加个总时间\(E\)。
所以$$f_i=\min{f_j+\max{T,\ 2(p_i-p_{j+1})}}$$
尝试对这个\(\max\)分类讨论一下。
假如我们维护最接近原点且满足\(T>2(p_i-p_{j+1})\)的位置\(j\),那么方程就是\(f_i=\min\{f_j+T\}\)。
而对于不要的那些满足\(T\leq2(p_i-p_{j+1})\)的\(j\),\(f_i=\min\{f_j+2p_i-2p_{j+1}\}\),只要记录这些\(j\)的\(f_j-2p_{j+1}\)的最小值就可以了(是段前缀)。
复杂度\(O(n)\)。
//4ms 2304KB
#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 1000000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=1e5+5;
int p[N];
LL f[N];
char IN[MAXIN],*SS=IN,*TT=IN;
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
int main()
{
int n=read(),E=read(),T=read();
for(int i=1; i<=n; ++i) p[i]=read();
LL mn=1e16;
for(int i=1,j=0; i<=n; ++i)
{
while(T<=2*(p[i]-p[j+1])) mn=std::min(mn,f[j]-2*p[j+1]), ++j;
if(j!=i) f[i]=std::min(f[j]+T,mn+2*p[i]);
else f[i]=mn+2*p[i];
}
printf("%lld\n",f[n]+E);
return 0;
}
AGC 007D.Shik and Game(DP)的更多相关文章
- AGC 018E.Sightseeing Plan(组合 DP)
题目链接 \(Description\) 给定三个不相交的矩形\(A(X1,Y1)-(X2,Y2),B(X3,Y3)-(X4,Y4),C(X5,Y5)-(X6,Y6)\),求 从第一个矩形中某点\(a ...
- AGC 001E.BBQ Hard(组合 DP)
题目链接 \(Description\) 给定长为\(n\)的两个数组\(a,b\),求\[\sum_{i=1}^n\sum_{j=i+1}^n\binom{a_i+a_j+b_i+b_j}{a_i+ ...
- agc007D - Shik and Game(dp 单调性)
题意 题目链接 Sol 主人公的最优决策一定是经过熊->返回到某个位置->收集经过的钻石 那么可以直接设\(f[i]\)表示收集完了前\(i\)个位置的钻石的最小时间,转移的时候枚举下最后 ...
- 洛谷 P3580 - [POI2014]ZAL-Freight(单调队列优化 dp)
洛谷题面传送门 考虑一个平凡的 DP:我们设 \(dp_i\) 表示前 \(i\) 辆车一来一回所需的最小时间. 注意到我们每次肯定会让某一段连续的火车一趟过去又一趟回来,故转移可以枚举上一段结束位置 ...
- AGC 018E.Sightseeing Plan——网格路径问题观止
原题链接 鸣谢:AGC 018E.Sightseeing Plan(组合 DP) 本蒟蒻认为,本题堪称网格路径问题观止. 因为涵盖了不少网格路径问题的处理方法和思路. 一句话题意: 给你三个矩形. 三 ...
- AtCoder Beginner Contest 122 D - We Like AGC(DP)
题目链接 思路自西瓜and大佬博客:https://www.cnblogs.com/henry-1202/p/10590327.html#_label3 数据范围小 可直接dp f[i][j][a][ ...
- AtCoder Beginner Contest 122 D - We Like AGC (DP)
D - We Like AGC Time Limit: 2 sec / Memory Limit: 1024 MB Score : 400400 points Problem Statement Yo ...
- AGC 005D.~K Perm Counting(容斥 DP 二分图)
题目链接 \(Description\) 给定\(n,k\),求 满足对于所有\(i\),\(|a_i-i|\neq k\)的排列的个数. \(2\leq n\leq 2000,\quad 1\leq ...
- AGC 016 F - Games on DAG(状压dp)
题意 给你一个有 \(n\) 个点 \(m\) 条边 DAG 图,点的标号和拓扑序一致. 现在有两个人进行博弈,有两个棋子分别在 \(1, 2\) 号点上,需要不断移动到它指向的点上. 如果当前两个点 ...
随机推荐
- cf909C 线性dp+滚动数组好题!
一开始一直以为是区间dp.. /* f下面必须有一个s 其余的s可以和任意f进行匹配 所以用线性dp来做 先预处理一下: fffssfsfs==>3 0 1 1 dp[i][j] 表示第i行缩进 ...
- node.js 的热更新
1.安装 npm i supervisor -gd 2.运行 supervisor server.js //server.js 是你自己的服务的js文件
- mongoDB通过_id删除doc
转载: 点击查看原文 做项目遇到一个需求,需要根据mongodb数据记录里面的_id字段删除相应的docs,实际使用时发现直接如下使用 db.collection('infochanges').rem ...
- shell 脚本加密
日常编写shell脚本时会写一些账号和密码写入脚本内,但是不希望泄露账号密码,所以对shell脚本进行加密变成可执行文件. 主要使用 shc 对 Linux shell 脚本加密,shc是一个专业的加 ...
- Vue2 异步获取的数据(通过ajax)获取的数据 渲染到dom上
页面dom结构如下 <ul class="user" id="app"> <li><span>姓名: </span&g ...
- 集腋成裘-06-angularJS -angular_02
1.0 选项卡 其中涉及到了三目运算符号; <!DOCTYPE html> <html ng-app="test"> <head> <me ...
- VS2017+mysql5.7 连接数据库生成实体
参考:https://www.cnblogs.com/RushPasser/p/5438334.html 下载:https://share.weiyun.com/5rM4FrG mysql-for-v ...
- Git强制拉取覆盖本地
1.多条执行 git fetch --all git reset --hard origin/master git pull 2.单条执行 git fetch --all && git ...
- Java集合源码学习(一)Collection概览
1.集合框架 Java集合框架包含了大部分Java开发中用到的数据结构,主要包括List列表.Set集合.Map映射.迭代器(Iterator.Enumeration).工具类(Arrays.Coll ...
- 导出CSV乱码
导出CSV,无论是什么格式,excel打卡都是乱码 需要加上 echo "\xEF\xBB\xBF"; header("Content-Disposition:attac ...