Gym 100801J Journey to the "The World's Start"(二分+单调队列)
2024-09-01 17:19:38
题意: 现在有1,2,3...N这N个站, 给定限定时间Limt, N-1种票的价格, 分别对应一个最远距离, 叫你选择一种票, 满足可以在规定时间到达N站台,而且价格最低
思路: 如果买距离为L的票可以在规定时间到,那么距离>L的票也一定能到. 我们只需要二分出这个下界 L,然后在>=L里选择一个最低价格即可. 二分里面用单调队列优化. 复杂度O(NlgN).
(注意可能爆 long long
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=;
ll p[maxn],t[maxn],q[maxn],dp[maxn],head,tail,N,Limit;
bool check(ll L)
{
head=tail=; q[head]=; dp[]=;
for(int i=;i<=N;i++){
while(tail<head&&i-q[tail]>L) tail++;
dp[i]=dp[q[tail]]+t[i];
q[++head]=i;
while(tail<head&&dp[q[head]]<=dp[q[head-]]) q[head-]=q[head],head--;
}
return dp[N]<=Limit;
}
int main()
{
int i; scanf("%I64d%I64d",&N,&Limit); Limit-=(N-);
for(i=;i<N;i++) scanf("%d",&p[i]);
for(i=;i<N;i++) scanf("%d",&t[i]);
ll L=,R=N-,Mid,Mn=;
while(L<=R){
Mid=(L+R)/;
if(check(Mid)) Mn=Mid,R=Mid-;
else L=Mid+;
}
ll ans=p[Mn];
for(i=Mn+;i<N;i++) ans=min(p[i],ans);
printf("%I64d\n",ans);
return ;
}
最新文章
- Unity中脚本的执行顺序总结(@WhiteTaken)
- Java单例模式实现的几种方式
- ACM Coin Test
- web项目引用Java项目,连接报错error HTTP Status 500 - Servlet execution threw an exception
- XPath语法 在C#中使用XPath示例 【转http://www.cnblogs.com/yukaizhao/archive/2011/07/25/xpath.html】非常详细的文章
- C#基础--面向对象计算器
- pjax 历史管理 jQuery.History.js
- [iOS 多线程 &; 网络 - 1.0] - 多线程概述
- 174. Dungeon Game
- poj2926 曼哈顿最远距离
- grunt用来压缩前端脚本
- ArcGIS RunTime SDK for Android之Features and graphics
- IPD体系向敏捷开发模式转型实施成功的四个关键因素
- Linux网络设备驱动 _驱动模型
- 发送Http
- 修改.net core MVC默认端口
- openssl安装/更新教程(CentOS)
- #leetcode刷题之路48-旋转图像
- Java 二维码--转载
- 利用 ICEpdf 快速实现 pdf 文件预览功能