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


【Problem Description】

一座城市为无向图带权图,一号节点为披萨餐厅的位置,有\(k\)个人定披萨,按时间先后顺序给出定披萨的时间\(s_i\),地点\(u_i\)以及这个人的披萨在哪个时间做好\(t_i\)。问在所有配送方案中,所有人的等待时间的最大值最小是多少?配送顺序完全按照先来先服务的原则

【Solution】

首先求\(n\)次\(Dijkstra\)求出任意两点间配送所需要的最短路程时间是多少。然后二分答案\(t\),即假定所有人的等待时间的最大值为\(t\),然后枚举验证即可。

因为配送顺序按照先来先服务的原则,所以不同方案间唯一的区别就是:从餐厅出发后连续配送多少个订单后回到餐厅。定义数组\(d[i]\)表示配送第\(i\)个人的订单,并回到餐厅需要的最短时间为\(d[i]\)。对于第\(i\)个订单,要么连续配送\(1,2,\dots,i\),要么连续配送\(2,3,\dots,i\),要么\(\dots\),要么直接配送\(i\),时间取最小值即可。所以直接\(O(n^2)\)枚举即可。


【Code】

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
#define int long long
#define maxn 1005
#define maxm 5005
#define INF 1e15
namespace Dijkstra{
struct node{
int v,w,next;
node(){}
node(int v,int w,int next=-1):v(v),w(w),next(next){}
bool operator <(const node&a)const{
return w>a.w;
}
}g[maxm<<1];
int head[maxn],cnt=0;
bool vis[maxn];
void init(){
memset(head,-1,sizeof(head));cnt=0;
}
void addedge(int u,int v,int w){
g[cnt]=node(v,w,head[u]);
head[u]=cnt++;
}
int dis[maxn][maxn];
void Run(int r,int n){
for(int i=0;i<=n;i++) dis[r][i]=INF;dis[r][r]=0;
memset(vis,0,sizeof(vis));
priority_queue<node>q;
q.push({r,0});
while(!q.empty()){
node now=q.top();q.pop();
int u=now.v;
if(vis[u]) continue;
vis[u]=1;
for(int i=head[u];~i;i=g[i].next){
int v=g[i].v,w=g[i].w;
if(!vis[v]&&dis[r][u]+w<dis[r][v]){
dis[r][v]=dis[r][u]+w;
q.push({v,dis[r][v]});
}
}
}
}
};
int s[maxn],u[maxn],t[maxn],dp[maxn];//第i个人的最短配送时间为dp[i]
bool check(int mid,int k){
for(int i=1;i<=k;i++) dp[i]=INF;dp[0]=0;
for(int i=0;i<k;i++){
int len=0/*配送路程*/,Min=INF/*最晚能在什么时候离开餐厅,同一批的取最小值*/,st=dp[i]/*离开餐厅的时间*/;
for(int j=i+1;j<=k;j++){
if(j==i+1) len+=Dijkstra::dis[1][u[j]];
else len+=Dijkstra::dis[u[j-1]][u[j]];
st=max(st,t[j]);
Min=min(Min,mid-(len-s[j]));
int delay=len+st-s[j];
if(delay<=mid&&st<=Min) dp[j]=min(dp[j],st+len+Dijkstra::dis[u[j]][1]); //在满足条件的情况下,才更新答案
else break;
}
}
return dp[k]<INF; //如果最后一个订单都配送到了,则满足条件
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);Dijkstra::init();
int n,m;cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v,w;cin>>u>>v>>w;
Dijkstra::addedge(u,v,w);
Dijkstra::addedge(v,u,w);
}
for(int i=1;i<=n;i++){
Dijkstra::Run(i,n); //求任意两个节点之间的最短路径
}
int q;cin>>q;
for(int i=1;i<=q;i++){
cin>>s[i]>>u[i]>>t[i];
}
int left=0,right=1e15,mid,ans=INF;
while(left<=right){ //二分答案
mid=(left+right)>>1;
if(check(mid,q)){
right=mid-1;
ans=min(ans,mid);
}else{
left=mid+1;
}
}
cout<<ans<<endl;
cin.get(),cin.get();
return 0;
}

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

  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)-E. Explosion Exploit-概率+状压dp

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

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

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

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

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

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

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

  6. 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_ ...

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

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

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

    题目链接:https://codeforc.es/gym/101933/problem/D 题意:地图上有 n 个位置和 m 条边,每条边连接 u.v 且有一个距离 w,一共有 k 个询问,每个询问表 ...

  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. [转]nodejs导出word

    转载自:https://blog.51cto.com/13803916/2133602 需要先下载依赖: npm install officegen 亲测可用: var officegen = req ...

  2. [LeetCode] 583. Delete Operation for Two Strings 两个字符串的删除操作

    Given two words word1 and word2, find the minimum number of steps required to make word1 and word2 t ...

  3. JavaScript原生封装ajax请求和Jquery中的ajax请求

    前言:ajax的神奇之处在于JavaScript 可在不重载页面的情况与 Web 服务器交换数据,即在不需要刷新页面的情况下,就可以产生局部刷新的效果.Ajax 在浏览器与 Web 服务器之间使用异步 ...

  4. ES6新增的一些特性

    1.let关键字,用来代替 var的关键字,特点: 1.变量不允许被重复定义 2.不会进行变量声明提升 3.保留块级作用域中i的 2.const定义常量,特点:1.常量值不允许被改变 2.不会进行变量 ...

  5. 【C++札记】拷贝构造函数,浅拷贝和深拷贝

    一:拷贝构造函数 拷贝构造函数是一种特殊的构造函数,遵循如下的规则: 1.函数名和类名一致,没有返回值. 2.必须有一个参数,参数是本类型的一个引用变量. 3.拷贝构造函数可以访问参数对象的任意成员( ...

  6. 解决SQL server 18740、18456登录失败问题

    第一步:使用window管理员用户登录SQL server 第二步:如下图步骤(开始配置sa默认用户) 第三步:选择角色类型 第四步:选择和配置用户映射的数据库 第五步:授予允许连接,并开启登录权限 ...

  7. Matplotlib:绘图和可视化

    Matplotlib:绘图和可视化 简介 简单绘制线形图 plot函数 支持图类型 保存图表 一 .简介 Matplotlib是一个强大的Python绘图和数据可视化的工具包.数据可视化也是我们数据分 ...

  8. vs2019中调用本地数据库mdf的相关问题

    程序中要用到数据库文件mdf,这个不像sql文件一样能直接用txt打开,所以很麻烦 所以mysql要比sqlserver好用,哎 要使用本地的mdf文件数据库,首先要将web.config中的网络连接 ...

  9. 14-4 ADO.NET简介

    微软数据访问方式历史阶段 ①ODBC(Open Database Connectivity)是第一个使用SQL访问不同关系数据库的访问技术.使用ODBC应用程序能够通过单一的命令操作不同的数据库,而开 ...

  10. 关于Java无法解码(ajax编码 Java解码)

    今天遇到了一个非常奇~~~~~~葩的问题,无解! 一向前端碰到中文,请求都使用encodeURI(encodeURI("中文"))编码,然后后端使用URLDecoder.decod ...