20152016-acmicpc-neerc-northern-subregional-contest J:Journey to the "The World's Start"(单调队列+DP+二分)
http://codeforces.com/gym/100801/attachments
题意:给出n-1张不同的票,票价分别为 pi,每张票每次最多可以坐 r 个站(1<=r<n),并且票是可以无限用并且只能买一张,如果坐到限定的距离了,要出站再重新进站,这里要花费 di 的时间(2<=i<=n-1),并且每坐一个站花费 1 min,一个人坐地铁要从第一个站坐到最后一个站,问在规定时间 t 里面可以买到的最低票价是多少。
思路:首先可以确定的是,我们对票价都要进行一次DP,我自己推出的方程是dp[i] = min(dp[i], (dp[i-j] + j) + time[i]),(1<=j<=r),接着发现无论怎么样,那个人肯定要坐 n-1 个站,所以直接让 t 减去 n - 1,然后方程变成dp[i] = min(dp[i], dp[i-j]+time[i]),这样的话DP时间复杂度还是O(n^2)。
由于是 f[k] + g[i] 型的 dp(只有形如 dp[i]=max/min (f[k]) + g[i] (k<i && g[i]是与k无关的变量)才能用到单调队列进行优化。),我们可以使用单调队列来优化这个DP,化成dp[i] = min(dp[i], dp[que[head]] + time[i])这样的形式。这样优化之后时间复杂度就直接变成了O(n)了。
只有这样还是不够的,因为我们要枚举每种票,通过题意可以发现每种票的距离 r 是递增的,因此我们可以通过二分搜索来枚举,这样复杂度就变成了O(nlogn)了,还有一点就是可能一种票的路程比搜索出来的临界值大,但是价格较小,我们应该枚举一下后面的取较小者。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <map>
#include <cstdlib>
typedef long long LL;
using namespace std;
#define N 50005
#define INF 0x3f3f3f3f3f
//单调队列优化DP + 二分搜索
LL price[N];
LL time[N];
LL dp[N];
int que[N];
int n, t; bool solve(int r)
{
if(r == ) return false;
dp[] = ;
int head = , tail = ;
que[++tail] = ;
for(int i = ; i <= n; i++) {
dp[i] = dp[que[head]] + time[i];
// 如果队尾的时间大于当前时间,就删除,然后把当前的站插入
while(head <= tail && dp[que[tail]] >= dp[i])
tail--;
que[++tail] = i;
// 当前距离和之前的距离不能超过 r
while(head <= tail && i - que[head] >= r)
head++;
}
if(dp[n] > t) return false;
return true;
} int main()
{
// freopen("journey.in", "r", stdin);
// freopen("journey.out", "w", stdout);
scanf("%d%d", &n, &t);
for(int i = ; i < n; i++)
scanf("%I64d", &price[i]);
for(int i = ; i <= n-; i++)
scanf("%I64d", &time[i]);
//总共坐n-1个站要n-1 min
t -= n-;
int l = , r = n - ;
while(l <= r) {
int mid = (l+r) / ;
if(solve(mid)) {
r = mid - ;
} else {
l = mid + ;
}
} int ans = price[l];
for(int i = l + ; i < n; i++)
if(price[i] < ans) ans = price[i]; printf("%d\n", ans); return ;
}
20152016-acmicpc-neerc-northern-subregional-contest J:Journey to the "The World's Start"(单调队列+DP+二分)的更多相关文章
- 模拟赛小结:2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest
2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest 2019年10月11日 15:35-20:35(Solved 8,Penalty 675 ...
- 2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest (9/12)
$$2015-2016\ ACM-ICPC,\ NEERC,\ Northern\ Subregional\ Contest$$ \(A.Alex\ Origami\ Squares\) 签到 //# ...
- 【2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest D】---暑假三校训练
2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest D Problem D. Distribution in Metagonia Input ...
- 2015-2016 ACM-ICPC, NEERC, Southern Subregional Contest J Cleaner Robot
Cleaner RobotCrawling in process... Crawling failed Time Limit:2000MS Memory Limit:524288KB ...
- 2015-2016 ACM-ICPC, NEERC, Moscow Subregional Contest J - Jealousy
题意:有n张照片,每张照片上有一些妹子,要按照片顺序给妹纸安排男朋友,如果妹纸i安排的男朋友之前有女朋友,那么费用+wi,求总费用最小,和输出路径 题解:费用流,先把照片天数建点i连i+1,流量k(最 ...
- 2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest D:Distribution in Metagonia(构造)
http://codeforces.com/gym/100801/attachments 题意:给出一个数n(1 <= n <= 1e18),将 n 拆成 m 个整数,其中 m 必须是 2 ...
- 【题解】G.Graph(2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest)
题目链接G题 题意 序列 \(a_1,a_2,⋯,a_n\) 是一个排列, 当且仅当它含有 1 到 n 的所有整数. 排列 \(a_1,a_2,⋯,a_n\) 是一个有向图的拓扑排序,当且仅当对于每条 ...
- 2015-2016 ACM-ICPC, NEERC, Southern Subregional Contest A Email Aliases(模拟STL vector+map)
Email AliasesCrawling in process... Crawling failed Time Limit:2000MS Memory Limit:524288KB ...
- 2016-2017 ACM-ICPC, NEERC, Northern Subregional Contest
A. Anniversary Cake 随便挑两个点切掉就好了. #include<bits/stdc++.h> using namespace std; const int Maxn=2 ...
- 2015-2016 ACM-ICPC, NEERC, Southern Subregional Contest, B. Layer Cake
Description Dasha decided to bake a big and tasty layer cake. In order to do that she went shopping ...
随机推荐
- Fedora 30 安装 Gradle
当前的 Gradle 最新版本是5.4.1.您可以从发布页面下载所有 Gradle 版本的二进制文件和查看文档. 先决条件 Gradle 能够在所有主流操作系统上运行,只要具备 Java-JDK/JR ...
- linux之tail -F命令异常file truncated
使用tail -F收集日志时,经常报出file truncated, 导致日志又重新读取.tail: `test.out' has appeared; following end of new fi ...
- QT pro 添加带空格的路径以及添加库文件的正确方法
用这个:$$quote() 如何添加库?看下面添加mysql路径的例子: INCLUDEPATH += $$quote(C:\Program Files (x86)\MySQL\MySQL Serve ...
- 一步一步造个IoC轮子(二),详解泛型工厂
一步一步造个Ioc轮子目录 一步一步造个IoC轮子(一):Ioc是什么 一步一步造个IoC轮子(二):详解泛型工厂 一步一步造个IoC轮子(三):构造基本的IoC容器 详解泛型工厂 既然我说IoC容器 ...
- C++的中英文字符串表示(string,wstring),使用wcout.imbue(std::locale("chs"));本地化解析编码
在C++中字符串类的string的模板原型是basic_string template <class _Elem, class traits = char_traits<_Elem> ...
- Delphi7文件操作常用函数
1. AssignFile.Erase AssignFile procedure AssignFile(var F; FileName: string);:给文件变量连接一个外部文件名.这里需要注意的 ...
- QSS 盒子模型
每个 Widget 所在的范围都是一个矩形区域(无规则窗口也是一个矩形,只是有的地方是透明的,看上去不是一个矩形),像是一个盒子一样.QSS 支持盒子模型(Box Model),和 CSS 的盒子模型 ...
- .NET中的GC总结
来自<CLR via C# 3rd Edition>总结 只管理内存,非托管资源,如文件句柄,GDI资源,数据库连接等还需要用户去管理 循环引用,网状结构等的实现会变得简单.GC的标志也压 ...
- <iOS小技巧> 返回上级目录操作Goback()方法
Goback()方法功能:返回上一级界面,通过判断 popViewControllerAnimated 类型是否为空,来判断是present还是pop出来,然后直接做了releaseSelf操作: - ...
- GTest翻译词汇表
版本号:v_0.1 词汇表 Assertion: 断言. Bug: 不翻译. Caveat: 警告. Error bound: 误差范围. Exception: 异常. Flag: 标志位. Floa ...