【loj6177】「美团 CodeM 初赛 Round B」送外卖2 Floyd+状压dp
题目描述
一张$n$个点$m$条边的有向图,通过每条边需要消耗时间,初始为$0$时刻,可以在某个点停留。有$q$个任务,每个任务要求在$l_i$或以后时刻到$s_i$接受任务,并在$r_i$或以前时刻到$t_i$完成任务。同一时刻可以接受多个任务。问:最多能完成多少任务。
输入
第一行,三个正整数$n$、$m$、$q$;
接下来$m$行,每行三个正整数$u_i$、$v_i$、$c_i$,表示有一条从$u_i$到$v_i$,耗时$c_i$的边。
接下来$q$行,每行四个正整数$s_i$、$t_i$、$l_i$、$r_i$,描述一个任务。
输出
一个整数,表示最多能完成的任务数量。
样例输入
5 4 3
1 2 1
2 3 1
3 4 1
4 5 1
1 2 3 4
2 3 1 2
3 4 3 4
样例输出
2
题解
Floyd+状压dp
比赛时现场切的题,今天想到,于是写了题解。
显然两点之间一定是走最短路的,于是先使用Floyd预处理出两点之间的最短路。
然后考虑状压。由于一个任务有三种状态:未接受、接受但未完成、已完成。于是可以设三进制状态,表示每个任务的进程。
而时间范围过大无法设为状态,于是需要用dp值表示。考虑到可以逗留,因此时间越短,答案不会更劣。
于是设$f[i][j]$表示任务进程的状态为$i$,当前在点$j$的最短时间。那么枚举每一个任务,考虑其转移方式即可。
注意这里只需要考虑第二个点是任务的起点/终点的情况,因为保证了走的是最短路,中间的点停留没有意义(所以本题n和m可以出到3W左右)。
最后判断哪个状态合法,统计该状态能够做的任务个数即可。
时间复杂度$O(3^q·q^2)$。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int dis[25][25] , f[60000][25] , base[15] , qx[15] , qy[15] , ql[15] , qr[15];
int main()
{
int n , m , q , i , j , k , x , y , z , ans = 0 , tmp;
scanf("%d%d%d" , &n , &m , &q);
memset(dis , 0x3f , sizeof(dis));
for(i = 1 ; i <= n ; i ++ ) dis[i][i] = 0;
for(i = 1 ; i <= m ; i ++ ) scanf("%d%d%d" , &x , &y , &z) , dis[x][y] = min(dis[x][y] , z);
for(k = 1 ; k <= n ; k ++ )
for(i = 1 ; i <= n ; i ++ )
for(j = 1 ; j <= n ; j ++ )
dis[i][j] = min(dis[i][j] , dis[i][k] + dis[k][j]);
base[0] = 1;
for(i = 1 ; i <= q ; i ++ ) scanf("%d%d%d%d" , &qx[i] , &qy[i] , &ql[i] , &qr[i]) , base[i] = base[i - 1] * 3;
memset(f , 0x3f , sizeof(f)) , f[0][1] = 0;
for(i = 1 ; i < base[q] ; i ++ )
{
for(j = 1 ; j <= n ; j ++ )
{
for(k = 1 ; k <= q ; k ++ )
{
if(i % base[k] / base[k - 1] == 1)
f[i][qx[k]] = min(f[i][qx[k]] , max(f[i - base[k - 1]][j] + dis[j][qx[k]] , ql[k]));
else if(i % base[k] / base[k - 1] == 2 && f[i - base[k - 1]][j] + dis[j][qy[k]] <= qr[k])
f[i][qy[k]] = min(f[i][qy[k]] , f[i - base[k - 1]][j] + dis[j][qy[k]]);
}
}
}
for(i = 0 ; i < base[q] ; i ++ )
{
for(j = 1 ; j <= n ; j ++ )
{
if(f[i][j] != 0x3f3f3f3f)
{
for(tmp = k = 0 ; k < q ; k ++ )
if(i % base[k + 1] / base[k] == 2)
tmp ++ ;
ans = max(ans , tmp);
}
}
}
printf("%d\n" , ans);
return 0;
}
【loj6177】「美团 CodeM 初赛 Round B」送外卖2 Floyd+状压dp的更多相关文章
- loj6177 「美团 CodeM 初赛 Round B」送外卖2 最短路+状压dp
题目传送门 https://loj.ac/problem/6177 题解 一直不知道允不允许这样的情况:取了第一的任务的货物后前往配送的时候,顺路取了第二个货物. 然后发现如果不可以这样的话,那么原题 ...
- loj #6177. 「美团 CodeM 初赛 Round B」送外卖2 状压dp floyd
LINK:#6177.美团 送外卖2 一道比较传统的状压dp题目. 完成任务 需要知道自己在哪 已经完成的任务集合 自己已经接到的任务集合. 考虑这个dp记录什么 由于存在时间的限制 考虑记录最短时间 ...
- #6164. 「美团 CodeM 初赛 Round A」数列互质-莫队
#6164. 「美团 CodeM 初赛 Round A」数列互质 思路 : 对这个题来言,莫队可以 n*根号n 离线处理出各个数出现个的次数 ,同时可以得到每个次数出现的次数 , 但是还要处理有多少 ...
- 「美团 CodeM 初赛 Round A」最长树链
题目描述 Mr. Walker 最近在研究树,尤其是最长树链问题.现在树中的每个点都有一个值,他想在树中找出最长的链,使得这条链上对应点的值的最大公约数不等于1.请求出这条最长的树链的长度. 输入格式 ...
- Loj #6164. 「美团 CodeM 初赛 Round A」数列互质
link : https://loj.ac/problem/6164 莫队傻题,直接容斥做. #include<bits/stdc++.h> #define maxn 100005 #de ...
- 【填坑】loj6159. 「美团 CodeM 初赛 Round A」最长树链
水一水 枚举各个质数,把是这个数倍数的点留下,跑直径,没了 #include <bits/stdc++.h> using namespace std; int h,t,n,p,q,M,N; ...
- LiberOJ#6178. 「美团 CodeM 初赛 Round B」景区路线规划 概率DP
题意 游乐园被描述成一张 n 个点,m 条边的无向图(无重边,无自环).每个点代表一个娱乐项目,第 i 个娱乐项目需要耗费 ci 分钟的时间,会让小 y 和妹子的开心度分别增加 h1i ,h2i ,他 ...
- 「美团 CodeM 初赛 Round A」试题泛做
最长树链 树形DP.我们发现gcd是多少其实并不重要,只要不是1就好了,此外只要有一个公共的质数就好了.计f[i][j]表示i子树内含有j因子的最长链是多少.因为一个数的不同的质因子个数是log级别的 ...
- [美团 CodeM 初赛 Round A]数列互质
题目大意: 给出一个长度为n的数列a1,a2,a3,...,an,以及m组询问(li,ri,ki),求区间[li,ri]中有多少数在该区间中的出现次数与ki互质. 思路: 莫队. f[i]记录数字i出 ...
随机推荐
- mysqldump备份与基于bin-log实现完全恢复
MySQL数据库备份是一项非常重要的工作,mysql的备份主要分为逻辑备份和物理备份,同时,不同的生产环境要备份的策略也不会不同.下面先说一说备份时要考虑到的一些因素,然后再实际操作进行不同方式的数据 ...
- Ansible自动化配置详解
第1章 Ansible基本概述 1.1 ansible是一个配置管理系统configuration management system, 你只需要可以使用ssh访问你的服务器或设备就行. 1.安装软件 ...
- git stash应用
今天在看一个bug,之前一个分支的版本是正常的,在新的分支上上加了很多日志没找到原因,希望回溯到之前的版本,确定下从哪个提交引入的问题,但是还不想把现在的修改提交,也不希望在Git上看到当前修改的版本 ...
- 基于ftp服务的三种登录方式及其相关的访问控制和优化
ftp(简单文件传输协议),是一种应用广泛的网络文件传输协议和服务,占用20和21号端口,主要用于资源的上传和下载. 在linux对于ftp同widows一样具有很多的种类,这里主要介绍vsfptd( ...
- PHP中有关IPV4 和IPV6地址转换以及其它一些常见问题
这里主要介绍一下 IPV4 / IPV6 在 PHP / MySQL 中如何转换.以及中间容易碰到的一些问题. 首先介绍两个函数: ip2long:将 IPV4 的字符串互联网协议转换成长整型数字 i ...
- STM32CubeMx配置正交编码器遇到的问题
配置时参考了这个哥们的方法: http://www.eemaker.com/stm32cubemx-encoder.html 然后我的配置是这样的 配置是没有问题. 调用时出现了问题. 由于配置完了, ...
- C语言实例解析精粹学习笔记——30
实例30: 用已知字符串s中的字符,生成由其中n个字符组成的所有字符排列.设n小于字符串s的字符个数,其中s中的字符在每个排列中最多出现一次.例如,对于s[]="abc",n=2, ...
- 毕业2年 Summary
本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/135 看了下去年写毕业一周年总结的时间:2017-6-16,今天 ...
- Python3 适合初学者学习的银行账户登录系统
一.所用知识点: 1. for循环与if判断的结合 2. %s占位符的使用 3. 辅助标志的使用(标志位) 4. break的使用 二.代码示例: ''' 银行登录系统 ''' uname = &qu ...
- 匈牙利算法模板 hdu 1150 Machine Schedule(二分匹配)
二分图:https://blog.csdn.net/c20180630/article/details/70175814 https://blog.csdn.net/flynn_curry/artic ...