题目链接:https://codeforc.es/gym/101933/problem/D

题意:地图上有 n 个位置和 m 条边,每条边连接 u、v 且有一个距离 w,一共有 k 个询问,每个询问表示 ti 时间在位置 ui 有人下单点了披萨,而披萨店在 di 时间做好披萨可以送出去,披萨店在位置 1,送披萨必须按顺序送,问客人从下单到拿到披萨的最长等待时间最短是多少。

题解:首先可以对每个点跑一次 dij,预处理出每两点之间的最短路,然后考虑二分答案,判断是否合法。dp[i][j]代表已经送完前 i 个位置,且拿了前 j 个位置的披萨的最小时间,还需要一维 k,0 表示送完以后当前在第 i 个点披萨的位置,1 表示当前在披萨店,然后进行转移即可。

 #include <bits/stdc++.h>
#define sd(a) scanf("%d",&a)
#define mst(a,b) memset(a,b,sizeof a)
#define mp make_pair
typedef long long ll;
#define pb push_back
using namespace std;
typedef pair<int, int> pii;
const int maxn = 2e5 + ;
//int inf = 0x3f3f3f3f;
const int mod = ;
ll dis[][];
vector<pii>g[];
bool vis[];
void dij(int s, int n) {
ll inf2 = 1e16;
for(int i = ; i <= n; ++i)
dis[s][i] = inf2, vis[i] = ;
dis[s][s] = ;
priority_queue<pair<ll, int> >q;
q.push(mp(, s));
for(; !q.empty();) {
int u = q.top().second;
q.pop();
if(vis[u])
continue;
vis[u] = ;
for(int j = , sz = g[u].size(); j < sz; ++j) {
int v = g[u][j].first;
int w = g[u][j].second;
if(dis[s][v] > dis[s][u] + w) {
dis[s][v] = dis[s][u] + w;
q.push(mp(-dis[s][v], v));
}
}
}
}
int s[], to[], t[];
ll dp[][][];
bool check(ll x, int n, int k) {
ll inf2 = 1e16;
for(int i = ; i <= k; ++i)
for(int j = ; j <= k; ++j)
dp[i][j][] = dp[i][j][] = inf2;
dp[][][] = ;
for(int i = ; i < k; ++i) {
for(int j = i; j <= k; ++j) {
for(int o = ; o < ; ++o) {
if(dp[i][j][o] == inf2)
continue;
if(!o) {
dp[i][j][] = min(dp[i][j][], dp[i][j][] + dis[to[i]][]);
if(j > i && i < k) {
ll time = dp[i][j][] + dis[to[i]][to[i + ]];
if(s[i + ] + x >= time)
dp[i + ][j][] = min(dp[i + ][j][], time);
}
} else {
if(j < k)
dp[i][j + ][] = min(dp[i][j + ][], max(dp[i][j][], (ll)t[j + ]) );
if(i < k && j >= i + ) {
ll time = dp[i][j][] + dis[][to[i + ]];
if(s[i + ] + x >= time)
dp[i + ][j][] = min(dp[i + ][j][], time);
}
}
}
}
}
return dp[k][k][] != inf2;
} int main() {
#ifdef local
freopen("in", "r", stdin);
#endif // local
int n, m;
sd(n), sd(m);
for(int i = ; i <= m; ++i) {
int u, v, w;
sd(u), sd(v), sd(w);
g[u].pb(mp(v, w));
g[v].pb(mp(u, w));
}
int k;
sd(k);
to[] = ;
for(int i = ; i <= k; ++i)
sd(s[i]), sd(to[i]), sd(t[i]);
for(int i = ; i <= n; ++i)
dij(i, n);
ll ans = 1e16;
ll l = , r = ans;
for(; l <= r;) {
ll mid = (l + r) >> ;
if(check(mid, n, k))
ans = mid, r = mid - ;
else
l = mid + ;
}
printf("%lld\n", ans);
return ;
}

2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018) D. Delivery Delays (二分+最短路+DP)的更多相关文章

  1. (寒假GYM开黑)2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)

    layout: post title: 2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018) author: &qu ...

  2. 2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)- D. Delivery Delays -二分+最短路+枚举

    2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)- D. Delivery Delays -二分+最短路+枚举 ...

  3. 2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)-E. Explosion Exploit-概率+状压dp

    2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)-E. Explosion Exploit-概率+状压dp [P ...

  4. 2019年湖南多校第一场||2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)

    第一场多校就打的这么惨,只能说自己太菜了,还需继续努力啊- 题目链接: GYM链接:https://codeforces.com/gym/101933 CSU链接:http://acm.csu.edu ...

  5. 2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018) - 4.28

    赛后补了几道 赛中我就写了两个... A - Altruistic AmphibiansGym - 101933A 看了眼榜没几个人做.就没看. 最后发现就是一个DP(但是我觉得复杂度有点迷) 题意: ...

  6. Gym .101933 Nordic Collegiate Programming Contest (NCPC 2018) (寒假gym自训第四场)

    (本套题算是比较温和吧,就是罚时有点高. B .Baby Bites 题意:给出一个婴儿给出的数组,有一些数字听不清楚,让你还原,问它是否是一个从1开始的一次增加的数组. 思路:从左往右依次固定,看是 ...

  7. 2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018) Solution

    A. Altruistic Amphibians Upsolved. 题意: $有n只青蛙,其属性用三元组表示 <l_i, w_i, h_i> l_i是它能跳的高度,w_i是它的体重,h_ ...

  8. [十一集训] Day1 (2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018))

    A Altruistic Amphibians 原题 题目大意: n只青蛙在高度为d的井中,每只有跳跃距离.重量和高度,每只青蛙可以借助跳到别的青蛙的背上而跳出井,每只青蛙能承受的最大重量是自身重量, ...

  9. 2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018) A. Altruistic Amphibians (DP)

    题目链接:https://codeforc.es/gym/101933/problem/A 题意:有 n 只青蛙在一个坑里面,要求可以跳出坑的青蛙的最大数量.每个青蛙有 3 种属性:l 为青蛙一次可以 ...

随机推荐

  1. JavaSE基础(四)--Java基本数据类型

    Java 基本数据类型 变量就是申请内存来存储值.也就是说,当创建变量的时候,需要在内存中申请空间. 内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据. 因此,通过定义不 ...

  2. Oracle存储过程——日常记录

    代码规范 Oracle存储过程,关键字大写,变量小写并以v_开头,规范代码,提高可读性 赋值与判断符号 Oracle存储过程,变量赋值使用 := 符号,条件判断直接用 = 符号. 变量声明需在 beg ...

  3. orcale数据库授权码

    Product Code:4t46t6vydkvsxekkvf3fjnpzy5wbuhphqzserial Number:601769password:xs374ca

  4. python+pycharm+django admin css样式出问题

    最近打算学习一下Python,基础知识有了大概的了解,想上手搞搞东西. 我用的python 3.5+pycharm+django 1.11.2 在使用Django,打开127.0.0.1:8000/a ...

  5. 20190805-Python基础 第二章 列表和元组(2)列表

    1. list函数,用于将字符串转换为列表 2. 基本的列表操作 修改列表 - 给元素赋值,使用索引表示法给特定的元素赋值,如x[1] = 2 删除元素 - 使用del语句即可 name1 = ['a ...

  6. DVWA漏洞演练平台 - SQL注入

    SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,具体来说,它是利用现有应用程序将(恶意的)SQL命令注入到后台数据库引擎执 ...

  7. git忽略而不提交文件的3种情形

    1.从未提交过的文件可以用.gitignore 也就是添加之后从来没有提交(commit)过的文件,可以使用.gitignore忽略该文件 该文件只能作用于未跟踪的文件(Untracked Files ...

  8. C#Random随机值重复的解决方法

    使用如上图所示的代码,将会出现如下情况,明明是随机,可值都是同样的,这样的随机几率也太小了,所以估计是代码有问题. 于是搜索了下,发现引起这个问题的原因是C#中的Random是根据时间来产生随机数,而 ...

  9. C# 连接 Socks5 代理

    public class Socks5ProxyHelp { private Socks5ProxyHelp() { } public static string[] errorMsgs = { &q ...

  10. fish redux 个人理解

    fish redux 理解 fish redux是什么 Fish Redux 是一个基于 Redux 数据管理的组装式 flutter 应用框架, 它特别适用于构建中大型的复杂应用. 它的特点是配置式 ...