Delivery Delays

题意

100010001000个点,500050005000条边的无向图,披萨店在111号店.100010001000份披萨订单,每个订单有下单时间,送达地点,披萨制作出来的时间.你是快递员初始在111号点,每次可以拿无穷多披萨,送完以后返回111号点继续送,送餐的时候要求按照下单顺序送达,求等待时间最长的顾客的最小等待时间.

题解

其实这道题不难,读题的时候读漏了一个条件…然后就GG了.

最小化最大值的问题,我们可以思考二分答案再check的套路进行.

二分等待时间最长的顾客的等待时间MMM,则其他所有顾客的等待时间不应超过MMM.

如何checkcheckcheck呢?

答:我们可以用dpdpdp的方法进行checkcheckcheck.

考虑到所有的披萨都必须按照下单时间顺序送达,那么可以想象到最优的方案应该会将披萨序列分成若干小段,每一段都是从111号点出发,拿上该段所有的披萨,然后以最短路的形式,依次将披萨送达,最后回道111点.

那么我们就可以定义dp[i]dp[i]dp[i]表示将前iii块披萨准时送达,且最后回到111点出所花费的最小时间.

转移方程是O(n)O(n)O(n)的

对于iii这个点,将所有j≥i+1j \ge i+1j≥i+1的dp[j]dp[j]dp[j]全部更新.

定义len[i][j]len[i][j]len[i][j]表示从111出发,依次经过iii,i+1i+1i+1,…,jjj这些点的最短路径长度.

当用dp[i]dp[i]dp[i]来更新dp[j]dp[j]dp[j]的时候

  1. 我们注意到出发时间一定不能小于max{dp[i],t[i+1],t[i+2],...,t[j]}max\{dp[i],t[i+1],t[i+2],...,t[j]\}max{dp[i],t[i+1],t[i+2],...,t[j]},因为必须等这些披萨都制作完成后才能触出发

  2. 并且出发时间也一定不能大于min{M+s[i+1]−len[i][i+1],...,M+s[j]−len[i][j]}min\{M+s[i+1]-len[i][i+1],...,M+s[j]-len[i][j]\}min{M+s[i+1]−len[i][i+1],...,M+s[j]−len[i][j]}.
    因为对于每个ttt,满足i+1≤t≤ji+1 \le t \le ji+1≤t≤j,必然有len[i][t]+st−s[j]≤Mlen[i][t]+st -s[j] \le Mlen[i][t]+st−s[j]≤M,也即st≤M−len[i][t]+s[j]st \le M - len[i][t] +s[j]st≤M−len[i][t]+s[j]

同时满足这两个条件的jjj才能由iii进行转移.

如果最后dp[k]dp[k]dp[k]被更新过,那么限制MMM就是可星的,否则布星.

代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
#define pr(x) std::cout << #x << ':' << x << std::endl
#define rep(i,a,b) for(int i = a;i <= b;++i)
const int N  = 1007;
typedef long long LL;
const LL inf = 1e15;
typedef std::pair<LL,int> pii;
std::vector<pii> edge[N];
LL dis[N][N],dp[N];
void Dij(LL D[N],int s) {rep(i,0,N-1) D[i] = inf;std::priority_queue<pii,std::vector<pii>,std::greater<pii> > Q;D[s] = 0;Q.push((pii){D[s],s});while(!Q.empty()) {pii p = Q.top();Q.pop();int u = p.second;if(D[u] < p.first) continue;for(pii e : edge[u]) {int v = e.second;LL c = e.first;if(D[v] > D[u] + c) {D[v] = D[u] + c;Q.push((pii){D[v],v});}}}
}
LL s[N],t[N],u[N];
int n,m,k;
bool check(LL M) {dp[0] = 0;rep(i,1,k) dp[i] = inf;rep(i,0,k-1) {LL st = dp[i],len = 0,mxst = inf;rep(j,i+1,k) {if(j == i+1) len += dis[1][u[i+1]];else len += dis[u[j-1]][u[j]];st = std::max(st,t[j]);//离开1号点的时间mxst = std::min(mxst,M-len+s[j]);LL wait = st+len-s[j];//当前点等待时间if(wait <= M && st <= mxst) dp[j] = std::min(dp[j],st+len+dis[u[j]][1]);else break;}}return dp[k] < inf;
}
int main() {std::ios::sync_with_stdio(false);std::cin >> n >> m;rep(i,1,m) {int a,b;LL c;std::cin >> a >> b >> c;edge[a].push_back((pii){c,b});edge[b].push_back((pii){c,a});}rep(i,1,n) {Dij(dis[i],i);}std::cin >> k;rep(i,1,k) {std::cin >> s[i] >> u[i] >> t[i];}LL l = 0,r = inf;while(r > l) {LL mid = (l + r) >> 1;if(check(mid)) r = mid;else l = mid + 1;}std::cout << l << std::endl;
}

NCPC2018 D.Delivery Delays[二分答案+DP check]相关推荐

  1. 洛谷 P1800 software_NOI导刊2010提高(06)(二分答案+DP检验)

    P1800 software_NOI导刊2010提高(06) 标签 二分答案 难度 普及/提高- 题目描述 一个软件开发公司同时要开发两个软件,并且要同时交付给用户,现在公司为了尽快完成这一任务,将每 ...

  2. 校内互测 B. 王者荣耀 (二分答案+dp)

    B. 王者荣耀 时间限制:1s 内存限制:128MB 问题描述 从未来回来后,他知道他最近要打 n 局王者荣耀,其中第 i 局需要耗时li,并且这个顺序在时间上是不可改变的.作为一个很(mei)有自制 ...

  3. 二分答案(by jie)

    二分答案(by jie) 目录 1.前言: 2.方法: 3.典型例题 例题1.奇怪的函数(裸二分答案) 例题2.关押罪犯(二分答案+染色) 例题3.电话网络(二分答案+最短路径) 例题4.softwa ...

  4. 【BZOJ1044】【tyvj3511】【codevs1870】木棍分割,二分答案+滚动数组+前缀和DP

    传送门1 传送门2 传送门3 写在前面:就我看来,这是一道不错的题 思路: 一.对于"求总长度最大的一段的长度最小值"这个问题,我们比较容易想到二分答案然后判断是否合法,显然这个是 ...

  5. 道路覆盖 (二分答案+状压DP)

    Description: Tar 把一段凹凸不平的路分成了高度不同的 N 段(每一段相同高度),并用 H[i] 表示第 i 段高度.现在 Tar 一共有 n 种泥土可用,它们都能覆盖给定的连续的 k ...

  6. AtCoder AGC007E Shik and Travel (二分、DP、启发式合并)

    题目链接 https://atcoder.jp/contests/agc007/tasks/agc007_e 题解 首先有个很朴素的想法是,二分答案\(mid\)后使用可行性DP, 设\(dp[u][ ...

  7. Luogu4022 CTSC2012 熟悉的文章 广义SAM、二分答案、单调队列

    传送门 先将所有模板串扔进广义SAM.发现作文的\(L0\)具有单调性,即\(L0\)更小不会影响答案,所以二分答案. 假设当前二分的值为\(mid\),将当前的作文放到广义SAM上匹配. 设对于第\ ...

  8. BZOJ 4326 NOIP2015 运输计划(树上差分+LCA+二分答案)

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MB Submit: 1388  Solved: 860 [Submit][Stat ...

  9. codeforces 653D D. Delivery Bears(二分+网络流)

    题目链接: D. Delivery Bears time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

最新文章

  1. ubuntu php上传文件,Ubuntu中增加apache上传文件大小限制(突破Aapache默认2M上传限制)...
  2. 我的C#文章模块代码
  3. Outlook 获取联系人名片对象为空
  4. AAAI 2020 | NAS+目标检测:AI设计的目标检测模型长啥样?
  5. 11没有源码注释_我们为什么要看源码、应该如何看源码?
  6. (1.3)HarmonyOS鸿蒙启动程序运行流程
  7. java activemq 断线_java - 防止ActiveMQ重新连接失败时自动退出 - SO中文参考 - www.soinside.com...
  8. JVM调优 dump文件怎么生成和分析
  9. LeetCode 1722. 执行交换操作后的最小汉明距离(并查集)
  10. 怎么检测不到我的音频_新专利显示未来的AirPods可能会检测手势 并具有旋转式音量控制功能...
  11. 打开网页出现运行脚本错误的解决技巧
  12. 检查PHP扩展是否安装成功
  13. Arcpy 实现NDVI最大值合成/平均值合成
  14. java单线程任务调度_一文详解Spring任务执行和调度(小结)
  15. 有哪些好用的在线条形码生成器?
  16. chrome 独立安装包下载
  17. Vue3状态管理器大菠萝 Pinia 学习使用笔记
  18. 目标跟踪常用算法——EKF篇
  19. RocketMQ如何维持心跳
  20. Spec2006使用说明

热门文章

  1. mysql100链接同时处理_php 连接MYSQL 两个同时连接为什么只有一个连接成功,必须删掉一个,另外一个才查询生效出结果,下附代码...
  2. mycli mysql_MyCLI :易于使用的 MySQL/MariaDB 客户端
  3. 10-4 5-4 查询至少生产三种不同速度PC的厂商 (20 分)
  4. css3边框交替动画_用css3实现惊艳面试官的背景即背景动画(高级附源码)
  5. [蓝桥杯][算法提高VIP]最小乘积(提高型)-排序
  6. [蓝桥杯2016初赛]冰雹数-模拟
  7. 调用其他app 的lib_ButterKnife执行效率为什么比其他注入框架高?它的原理是什么...
  8. 牛客小白月赛12:月月给华华出题(欧拉函数)
  9. 笔记,Vector类模板的基本功能
  10. P1020 [NOIP1999 普及组] 导弹拦截 Dilworth定理 + dp