http://codeforces.com/gym/100801

题目大意:有从左到右有n个车站,有n-1种车票,第i种车票一次最多可以坐 i 站(1<=i<=n)   每种票有固定的价钱p[i],下车后可以继续上车,但每次下车都要再上车都要花费一定时间v[i],第1和n站上车不花费时间,车从一站到相邻的一站需要1分钟。只能买一种车票,问在t时间内 所有能从第1站到 第n站的方案  花费 的票价最低是多少。

解题思路: 
这道题的关键在于如何求每种票起点到达终点所需的最少时间,如果找出了每种票到车站的最少时间,再直接判断哪种票最便宜就好了。

对于求每种票的时间,最直观的想法是对每一种票进行dp,设dp[i]为到i站所需的最少时间,k为此票最多能乘坐的站数,v[i]为在此站下车又上车的时间。 
dp[i]=min(dp(i-j))+v[i] 1<=j<=i-k 
对于n-1种票,每种票枚举n个车站,枚举到每个车站时还要向前推k个,复杂度为O(n^3)

但我们会发现,如果 坐n站的车票,能够在t时间内到达 。那么 坐n+1站的车票,也能够在t时间内到达。 这样我们就可以二分查找所需时间小于等于t-(n-1)的车票中能坐站数最少的车票就好了。(规定时间内能够到达的车票分界线)复杂度n^2*logn 还是会超时

对于每次dp,我们观察状态方程发现最佳状态是找dp[i-j](1<=j<=i-k)区间中的最小值,每次查找时间是o(k) 。其实我们可以维护一个长度为k的单调队列来找最小值。复杂度o(n*logn) ,解决。

AC代码

 #include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+ ,mod = ,inf=0x3f3f3f3f;
const double pi=acos(-1.0);
typedef long long ll;
ll dp[maxn];
ll p[maxn],v[maxn],n,m;
struct node
{
ll val,pos;
}q[maxn];
ll solve(ll k)
{
memset(dp,inf,sizeof(dp));
ll head=,tail=;
for(ll i=;i<=k;i++) //前k个的最优解就是v[i]
{
dp[i]=v[i];
while(head<=tail&&dp[i]<=q[tail].val)tail--;
q[++tail].val=dp[i],q[tail].pos=i;
}
//cout<<tail<<endl;
for(ll i=k;i<=n;i++)
{
while(i-q[head].pos>k)head++; //注意下标范围
dp[i]=min(dp[q[head].pos]+v[i],dp[i]);
while(head<=tail&&dp[i]<=q[tail].val)tail--; //维护单调性
q[++tail].val=dp[i],q[tail].pos=i;
//for(int j=1;j<=k;j++) //未优化之前代码
// {
// if(i-j>0)
// dp[i]=min(dp[i-j]+v[i],dp[i]);
// }
}
return dp[n];
}
int main()
{
freopen("journey.in","r",stdin); //交题要用到文件流
freopen("journey.out","w",stdout);
scanf("%lld %lld",&n,&m);
for(ll i=;i<=n-;i++)
scanf("%lld",&p[i]);
v[]=v[n]=;
for(ll i=;i<=n-;i++)
scanf("%lld",&v[i]);
m-=n-;
ll l=,r=n-;
while(l<=r) //二分
{
ll mid=(l+r)/;
if(solve(mid)>m)
l=mid+;
else
r=mid-;
}
ll ans=inf;
for(ll i=l;i<=n-;i++) //找到分界点从右边区间找最小值
{
ans=min(ans,p[i]);
}
printf("%lld\n",ans);
}

Gym 100801 J. Journey to the “The World’s Start” DP+单调队列优化+二分的更多相关文章

  1. 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),并且 ...

  2. GYM 101572A(单调队列优化dp)

    要点 较好的思路解析 \(dp[i]\)为到达\(i\)花费的最短时间,\(dis[i]-dis[j]<=lim1\)的情况其实可以省略,因为就相当于没买咖啡,绝对不优于在那之前的某店买了咖啡并 ...

  3. codeforces gym100801 Problem J. Journey to the “The World’s Start”

    传送门:https://codeforces.com/gym/100801 题意: 小明坐地铁,现在有n-1种类型的地铁卡卖,现在小明需要买一种地铁票,使得他可以在t的时间内到达终点站,地铁票的属性为 ...

  4. 单调队列 + 组合数统计 Gym 101102D

    题目链接:http://codeforces.com/gym/101102/problem/D 题目大意:给你一个n*m的矩阵,矩阵里面的数值范围为[1,1e9].这个矩阵有一个值,如果相邻的多个数字 ...

  5. Problem J. Journey with Pigs

    Problem J. Journey with Pigshttp://codeforces.com/gym/241680/problem/J考察排序不等式算出来单位重量在每个村庄的收益,然后生序排列猪 ...

  6. Codeforces gym 101343 J.Husam and the Broken Present 2【状压dp】

     2017 JUST Programming Contest 2.0 题目链接:Codeforces gym 101343 J.Husam and the Broken Present 2 J. Hu ...

  7. 【codeforces.com/gym/100240 J】

    http://codeforces.com/gym/100240 J [分析] 这题我搞了好久才搞出样例的11.76....[期望没学好 然后好不容易弄成分数形式.然后我‘+’没打..[于是爆0... ...

  8. Codeforces GYM 100876 J - Buying roads 题解

    Codeforces GYM 100876 J - Buying roads 题解 才不是因为有了图床来测试一下呢,哼( 题意 给你\(N\)个点,\(M\)条带权边的无向图,选出\(K\)条边,使得 ...

  9. codeforces gym 100947 J. Killing everything dp+二分

    J. Killing everything time limit per test 4 seconds memory limit per test 64 megabytes input standar ...

随机推荐

  1. 安装CentOS--设置网络_1

    (1)在登录黑框中输入如下命令,让CentOS 7自动获取一个IP地址: # dhclient (2)正常情况下不会有任何输出内容.用如下命令查看获取到的IP地址: # ip addr 它将返回如图所 ...

  2. AJPFX总结final、finally、finallize的区别

    final.finally.finallize有何区别?    final表示一个修饰符,如果用它来修饰一个类,则该类是不能继承的:如果用它来修饰一个变量,则该变量一旦赋值之后就不能再修改:如果用它来 ...

  3. LoadRunner10自带的WEBTOURS,无法显示Flights页面问题解决办法

    [问题描述] 安装LoadRunner10之后,尝试打开自带的webTours页面学习.第一次可以打开,之后安装了一RFT.Oracle等软件,就出现页面无法显示问题.一直以为是Java的问题,尝试各 ...

  4. vue脚手架工具vue-cli

    一.什么 是脚手架工具vue-cli? 类似于工人手里面的脚手架一样,帮助工人搭架子用,同样的vue脚手架工具也是帮助我们更好更快速的开发代码的工具 二.vue-cli能做什么? 三.vue-cli安 ...

  5. JAVA基础——内存流

    掌握内存操作流 输入和输出都是从文件中来的,当然,也可将输出的位置设置在内存上,这就需要ByteArrayInputStream和ByteArrayOutputStream ByteArrayInpu ...

  6. getHiddenProp() 浏览器状态切换改变

    <script> function getHiddenProp() { var prefixes = ['webkit', 'moz', 'ms', 'o']; // if 'hidden ...

  7. (3)Gojs model简介

    (3)Gojs model简介 在GoJS中,model用来存储表的基本数据,包括node.link等具体对象和属性,与其在视觉上的展示效果不相关.model中往往只保存相对简单的数据,最方便且持久化 ...

  8. 大项目之网上书城(五)——主页(End)

    目录 大项目之网上书城(五)--主页(End) 主要改动 1.主页(终于完成啦) 完整代码 效果图 2.head.jsp的小改动 代码 3.login.jsp ###代码 效果图 4.login.js ...

  9. HDU - 4544 湫湫系列故事——消灭兔子(优先队列+贪心)

    题目: 最近,减肥失败的湫湫为发泄心中郁闷,在玩一个消灭免子的游戏. 游戏规则很简单,用箭杀死免子即可. 箭是一种消耗品,已知有M种不同类型的箭可以选择,并且每种箭都会对兔子造成伤害,对应的伤害值分别 ...

  10. 零基础入门学习Python(19)--函数:我的地盘听我的

    知识点 函数与过程 在许多编程语言中,函数(function)是有返回值的,过程(procedure)是简单.特殊并且没有返回值的.而在Python中,严格来说只有函数没有过程. 例如: >&g ...