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 ...
随机推荐
- [WPF]获取鼠标指针下的元素
原文:[WPF]获取鼠标指针下的元素 [WPF]获取鼠标指针下的元素 周银辉 以前写过一些GetElementUnderMouse之类的函数,要用到坐标换算而显得有些麻烦(特别是当元素有XXXTr ...
- DirectX 图形流水线
Direct3D 的可编程流水线用来为实时游戏渲染图形(一个词概括——实时渲染) 上面的图是Dx11的实时渲染流水线,Dx的几个版本都是向下兼容的. Input-Assembler Stage: 输入 ...
- 读BeautifulSoup官方文档之与bs有关的对象和属性(2)
上一节说到tag, 这里接着讲, tag有个属性叫做string, tag.string其实就是我们要掌握的四个对象中的第二个 ---- NavigableString, 它代表的是该tag内的te ...
- WPF 数据模板使用值转换器
<Window x:Class="CollectionBinding.MainWindow" xmlns="http://schemas.micros ...
- Windows证书的生成导出以及使用证书验证文件是否被修改
本文介绍了如何使用Windows自带的证书生成器生成,导出,使用证书.并以验证文件是否被修改举例 1.证书相关辅助类 public sealed class DataCertificate { #re ...
- 【全面解禁!真正的Expression Blend实战开发技巧】第二章 你好,UI设计师
原文:[全面解禁!真正的Expression Blend实战开发技巧]第二章 你好,UI设计师 你好,UI设计师 曾几何时我从没想过要与艺术家打交道,但是Silverlight改变了这一切.UI设计师 ...
- 未在本地计算机上注册“microsoft.ACE.oledb.12.0” 解决方法
今日写一个浏览Excel文件的代码,忽然发现提示如下错误,表示很惊讶,因为我的另外一台电脑不会,但是这台就包这个异常. 解决方法: 去http://download.microsoft.com/dow ...
- 微信小程序把玩(十二)text组件
原文:微信小程序把玩(十二)text组件 通常文本设置要不在wxml中设置,再要不就是通过weml绑定在js中设置文字. wxml <view > <text>我是文本组件&l ...
- Windows下配置Redis,并修改密码
原文:Windows下配置Redis,并修改密码 Windows下配置Redis,并修改密码 下载 Redis Windows版本的GitHub链接,直接下载zip文件解压到指定文件夹下或者下载msi ...
- UWP 设置控件样式四种方法
1.隐式方法,通过仅指定 Style 的 TargetType.(设置全部的Button样式) <Page.Resources > <Style TargetType="B ...