Description

T 城是一个旅游城市,具有 nnn 个景点和 mmm 条道路,所有景点编号为 1,2,...,n1,2,...,n1,2,...,n。每条道路连接这 nnn 个景区中的某两个景区,道路是单向通行的。每条道路都有一个长度。

为了方便旅游,每个景点都有一个加油站。第 iii 个景点的加油站的费用为 pip_ip​i​​,加油量为 cic_ic​i​​。若汽车在第 iii 个景点加油,则需要花费 pip_ip​i​​ 元钱,之后车的油量将被加至油量上限与 cic_ic​i​​ 中的较小值。不过如果加油前汽车油量已经不小于 cic_ic​i​​,则不能在该景点加油。

小 C 准备来到 T 城旅游。他的汽车油量上限为 CCC。旅游开始时,汽车的油量为 000。在旅游过程中:

1、当汽车油量大于 000 时,汽车可以沿从当前景区出发的任意一条道路到达另一个景点(不能只走道路的一部分),汽车油量将减少 111;

2、当汽车在景点 iii 且当前油量小于 cic_ic​i​​ 时,汽车可以在当前景点加油,加油需花费 pip_ip​i​​ 元钱,这样汽车油量将变为 min{ci,C}\min{c_i,C}min{c​i​​,C}。

一次旅游的总花费等于每次加油的花费之和,旅游的总路程等于每次经过道路的长度之和。注意多次在同一景点加油,费用也要计算多次,同样地,多次经过同一条道路,路程也要计算多次。

小 C 计划旅游 TTT 次,每次旅游前,小 C 都指定了该次旅游的起点和目标路程。由于行程不同,每次出发前带的钱也不同。为了省钱,小 C 需要在旅游前先规划好旅游路线(包括旅游的路径和加油的方案),使得从起点出发,按照该旅游路线旅游结束后总路程不小于目标路程,且剩下的钱尽可能多。请你规划最优旅游路线,计算这 TTT 次旅游每次结束后最多可以剩下多少钱。

solution

看到 \(dis>=10^9\) 和 \(n<=100\) 这种东西,要想到倍增Floyed,首先要发现我们不能把油记录在dp状态里面否则开不下,我们考虑枚举加油位置.

我们定义 \(dp[i][j]\) 表示从 \(i\)出发,在j加满油,花费 \(j\) 元钱可以走的最大距离,答案就是满足 \(dp[i][j]>=d\) 的最大j,所以我们要想办法预处理出这个,然后询问就可以快速回答了,\(dp[i][j]=Max(dp[k][j-p[i]]+dis[j][k])\),\(dis[i][j]\) 表示从 \(i\) 出发达到 \(j\),经过道路数不超过 \(Min(c[i],C)\) 的最长距离,可以倍增Floyd预处理出来,然后dp数组具有二分性,可以二分回答询问,但是我爆枚也过了,最坏10^9,常数太小了,哎...

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<cstring>
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
#define RG register
using namespace std;
typedef long long ll;
const int N=105,M=2005;
const ll inf=2e15;
int n,m,C,T,p[N],c[N];ll w[N][N][20];
ll f[N],g[N],dis[N][N],dp[N][N*N]; void work()
{
scanf("%d%d%d%d",&n,&m,&C,&T);
for(int i=1;i<=n;i++){
scanf("%d%d",&p[i],&c[i]);
if(c[i]>C)c[i]=C;
}
int x,y,z;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=0;k<=18;k++)
w[i][j][k]=-inf;
for(int i=1;i<=n;i++)w[i][i][0]=0;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);
w[x][y][0]=Max(w[x][y][0],z);
}
for(int k=1;k<=18;k++)
for(int l=1;l<=n;l++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
w[i][j][k]=Max(w[i][j][k],w[i][l][k-1]+w[l][j][k-1]); for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
g[j]=(i==j?0:-inf),f[j]=-inf; for(int k=18;k>=0;k--){
if(((1<<k)&c[i])==0)continue;
for(int j=1;j<=n;j++){
for(int l=1;l<=n;l++)
f[j]=Max(f[j],g[l]+w[l][j][k]);
}
for(int j=1;j<=n;j++)g[j]=f[j];
}
for(int j=1;j<=n;j++)dis[i][j]=g[j];
} int lim=n*n;
for(int k=0;k<=lim;k++){
for(int i=1;i<=n;i++){
if(k<p[i])continue;
for(int j=1;j<=n;j++)
dp[i][k]=Max(dp[i][k],dp[j][k-p[i]]+dis[i][j]);
}
}
while(T--){
scanf("%d%d%d",&x,&y,&z);
int ans=y+1;
for(int i=0;i<=y;i++){
if(dp[x][i]>=z){ans=i;break;}
}
printf("%d\n",y-ans);
}
} int main()
{
freopen("trip.in","r",stdin);
freopen("trip.out","w",stdout);
work();
return 0;
}

「LibreOJ NOIP Round #1」旅游路线的更多相关文章

  1. LibreOJ #539. 「LibreOJ NOIP Round #1」旅游路线(倍增+二分)

    哎一开始看错题了啊T T...最近状态一直不对...最近很多傻逼题都不会写了T T 考虑距离较大肯定不能塞进状态...钱数<=n^2能够承受, 油量再塞就不行了...显然可以预处理出点i到j走c ...

  2. 【LibreOJ】#539. 「LibreOJ NOIP Round #1」旅游路线

    [题意]给定正边权有向图,车油量上限C,每个点可以花费pi加油至min(C,ci),走一条边油-1,T次询问s点出发带钱q,旅行路程至少为d的最多剩余钱数. n<=100,m<=1000, ...

  3. LOJ#539. 「LibreOJ NOIP Round #1」旅游路线

    n<=100,m<=1000的图,在此图上用油箱容量C<=1e5的车来旅行,旅行时,走一条边会耗一单伟油,在点i时,若油量<ci,则可以把油以pi的价格补到ci,pi<= ...

  4. LOJ #539. 「LibreOJ NOIP Round #1」旅游路线 倍增floyd + 思维

    考试的时候是这么想的: 求出每一个点花掉 $i$ 的花费向其他点尽可能走的最长距离,然后二分这个花费,找到第一个大于 $d$ 的就输出$.$然而,我这个记忆化搜索 $TLE$ 的很惨$.$这里讲一下正 ...

  5. 「LOJ 539」「LibreOJ NOIP Round #1」旅游路线

    description 题面较长,这里给出题目链接 solution 考虑预处理出\(f[i][j]\)表示在第\(i\)个点加满油后,从第\(i\)个点出发,至多消耗\(j\)元钱走过的最大路程,那 ...

  6. LibreOj #539. 「LibreOJ NOIP Round #1」旅游路线

    题目链接 做完这道题,我深知当一个问题复杂度过高的时候,把一些可以分离的操作都分散开,可以大幅度降低复杂度..... 发现无论有多少钱,每到一个点后扩展到的距离被限制在 \(min(C, c[i])\ ...

  7. 【LibreOJ】#538. 「LibreOJ NOIP Round #1」数列递推

    [题意]LibreOJ [算法]乱搞 [题解]容易发现数列最后一定单调,最后单调递增则最大值赋为最后一个,反之最小值赋为最后一个,然后处理一些细节就可以AC,要注意以下几点: 1.数列连续三项以及数列 ...

  8. 题解【loj537】「LibreOJ NOIP Round #1」DNA 序列

    题目描述 \(NOIP\)复赛之前\(HSD\)桑进行了一项研究,发现人某条染色体上的一段\(DNA\)序列中连续的\(k\)个碱基组成的碱基序列与做题的 \(AC\) 率有关!于是他想研究一下这种关 ...

  9. 「LOJ 537」「LibreOJ NOIP Round #1」DNA 序列

    description NOIP 复赛之前,HSD 桑进行了一项研究,发现人某条染色体上的一段 DNA 序列中连续的\(k\)个碱基组成的碱基序列与做题的 AC 率有关!于是他想研究一下这种关系. 现 ...

随机推荐

  1. 2017-2018-1 1623 bug终结者 冲刺007

    bug终结者 冲刺007 by 20162302 杨京典 今日任务:排行榜界面 排行榜界面,选项界面 简要说明 排行榜界面用于展示用户通关是所使用的步数和时间,选项界面可以调整背景音乐的开关.选择砖块 ...

  2. DML数据操作语言之复杂查询

    1.视图(View) 我们知道,在关系型数据库中,用来保存实际数据记录的是数据表.和表同等概念也是用来保存东西是:视图. 但是数据表是用来保存实际数据记录的,而视图是用来保存常用select语句的. ...

  3. hdu 3642 Get The Treasury

    Get The Treasury http://acm.hdu.edu.cn/showproblem.php?pid=3642 Time Limit: 10000/5000 MS (Java/Othe ...

  4. hdu 5274 Dylans loves tree

    Dylans loves tree http://acm.hdu.edu.cn/showproblem.php?pid=5274 Time Limit: 2000/1000 MS (Java/Othe ...

  5. [SDOI2014]旅行

    洛谷 P3313 [SDOI2014]旅行 https://www.luogu.org/problem/show?pid=3313 题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接 ...

  6. Java 多线程 从无到有

    个人总结:望对屏幕对面的您有所帮助 一. 线程概述 进程: 有独立的内存控件和系统资源 应用程序的执行实例 启动当前电脑任务管理器:taskmgr 进程是程序(任务)的执行过程,它持有资源(共享内存, ...

  7. nyoj 聪明的kk

    聪明的kk 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 聪明的"KK"非洲某国展馆的设计灵感源于富有传奇色彩的沙漠中陡然起伏的沙丘,体现出本国 ...

  8. EasyUI 主布局整合。

    博文学习地址:http://www.cnblogs.com/xishuai/p/3620327.html html: <%@ Page Language="C#" AutoE ...

  9. web信息泄露注意事项

    1. 确保您的Web服务器不发送显示有关后端技术类型或版本信息的响应头. 2. 确保服务器打开的端口上运行的所有服务都不会显示有关其构建和版本的信息. 3. 确保所有目录的访问权限正确,保证不会让攻击 ...

  10. js 过多 导致页面加载过慢

    自己的代码检查了很久,才检查 出来 通常我们的网站里面会加载一些js代码,统计啊,google广告啊,百度同盟啊,阿里妈妈广告代码啊, 一堆,最后弄得页面加载速度很慢,很慢. 解决办法:换一个js包含 ...