首页 > 其他分享 >Gym104095L 送外卖

Gym104095L 送外卖

时间:2024-01-29 11:46:04浏览次数:32  
标签:Gym104095L rep rd define 外卖 time include dis

https://codeforces.com/gym/104095/attachments/download/18184/statements.pdf

首先这个 \(n\le 14\) 的数据范围可以直接考虑状压了。设 \(f_{i,S,time}\) 为当前骑手在 \(i\) 号城市,已经把外卖送给了状态为 \(S\) 的城市,此时的时间为 \(times\) 所能获得的最大收益。当 \(time\) 为 \(201\) 时表示此时的时间为 \(>200\) 的答案。

考虑一个小事实:由于起始时间是整数 0,且到达某个城市的最短时间为整数,因此如果我们到达某城市的时间为小数,那么我们一定通过调整速度(路程除以时间)使得到达时间变为整数,从而能将时间压入状态内。

转移考虑枚举先前在城市 \(j\) 送外卖,和在城市 \(j\) 时的时间 \(time'\),那么在 \(j\) 号城市时送过外卖的状态即为 \(S'=S|2^{i-1}\),将 \(time\le 200\) 和 \(time=201\) 分开转移:

  • \(f_{i,S,time}=\max_{time'=0}^{time-dis_{i,j}}f_{j,S',time'}+p_{i,\oplus}\),其中 \(p_{i,\oplus}\) 表示送达时间为 \(time\) 时的价值,\(dis_{i,j}\) 表示 \(i,j\) 间最短路。
  • \(f_{i,S,201}=\max_{time'=0}^{201} f_{j,S',time'}+p_{i,d_i+1}\)。

时间复杂度 \(O(2^nn^2t^2)\),不能通过。

但是发现转移相当于取某段前缀的 max,前缀和优化掉一个 \(t\),时间复杂度 \(O(2^nn^2t)\),也许可以通过。过不掉的请卡常。

点击查看代码
//#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<map>
#include<unordered_map>
#include<vector>
#include<queue>
#include<bitset>
#include<set>
#include<ctime>
#include<random>
#define x1 xx1
#define y1 yy1
#define IOS ios::sync_with_stdio(false)
#define ITIE cin.tie(0);
#define OTIE cout.tie(0);
#define FlushIn fread(Fread::ibuf,1,1<<21,stdin)
#define FlushOut fwrite(Fwrite::obuf,1,Fwrite::S-Fwrite::obuf,stdout)
#define PY puts("Yes")
#define PN puts("No")
#define PW puts("-1")
#define P__ puts("")
#define PU puts("--------------------")
#define popc __builtin_popcount
#define pii pair<int,int>
#define mp make_pair
#define fi first
#define se second
#define gc getchar
#define pc putchar
#define pb emplace_back
#define rep(a,b,c) for(int a=(b);a<=(c);a++)
#define per(a,b,c) for(int a=(b);a>=(c);a--)
#define reprange(a,b,c,d) for(int a=(b);a<=(c);a+=d)
#define perrange(a,b,c,d) for(int a=(b);a>=(c);a-=d)
#define graph(i,j,k,l) for(int i=k[j];i;i=l[i].nxt)
#define lowbit(x) (x&-x)
#define lson(x) (x<<1)
#define rson(x) (x<<1|1)
#define mem(x,y) memset(x,y,sizeof x)
//#define double long double
#define int long long
//#define int __int128
using namespace std;
bool greating(int x,int y){return x>y;}
bool greatingll(long long x,long long y){return x>y;}
bool smallingll(long long x,long long y){return x<y;}
namespace Fread {
	const int SIZE=1<<21;
	char ibuf[SIZE],*S,*T;
	inline char getc(){if(S==T){T=(S=ibuf)+fread(ibuf,1,SIZE,stdin);if(S==T)return '\n';}return *S++;}
}
namespace Fwrite{
	const int SIZE=1<<21;
	char obuf[SIZE],*S=obuf,*T=obuf+SIZE;
	inline void flush(){fwrite(obuf,1,S-obuf,stdout);S=obuf;}
	inline void putc(char c){*S++=c;if(S==T)flush();}
	struct NTR{~NTR(){flush();}}ztr;
}
/*#ifdef ONLINE_JUDGE
#define getchar Fread::getc
#define putchar Fwrite::putc
#endif*/
inline int rd(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}return x*f;
}
inline void write(int x,char ch='\0'){
	if(x<0){x=-x;putchar('-');}
	int y=0;char z[40];
	while(x||!y){z[y++]=x%10+48;x/=10;}
	while(y--)putchar(z[y]);if(ch!='\0')putchar(ch);
}
bool Mbg;
const int maxn=15,maxm=16384,maxt=205,inf=0x3f3f3f3f;
const long long llinf=0x3f3f3f3f3f3f3f3f;
int n,m;
int dis[maxn][maxn];
int f[maxn][maxm][maxt],g[maxn][maxm][maxt];
int q[maxn],d[maxn];
int t[maxn][maxt],w[maxn][maxt];
void ckmx(int &x,int y){x=x>y?x:y;}
void solve_the_problem(){
	n=rd(),m=rd();
	mem(dis,0x3f);
	rep(i,1,n)dis[i][i]=0;
	rep(i,1,m){
		int x=rd(),y=rd(),z=rd();
		dis[x][y]=dis[y][x]=min(dis[x][y],z);
	}
	rep(k,1,n)rep(i,1,n)rep(j,1,n)dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
	rep(i,1,n)q[i]=rd();
	rep(i,1,n){
		d[i]=rd();
		rep(j,1,d[i])t[i][j]=rd();
		rep(j,1,d[i]+1)w[i][j]=rd();
		t[i][d[i]+1]=inf;
	}
	mem(f,0xc0),mem(g,0xc0);
	rep(i,1,n){
		int tim=min(max(dis[1][i],q[i]),201ll),p=1;
		rep(j,tim,201){
			while(t[i][p]<=j)p++;
			f[i][1<<(i-1)][j]=w[i][p];
			g[i][1<<(i-1)][j]=max(g[i][1<<(i-1)][j-1],f[i][1<<(i-1)][j]);
		}
	}
	rep(S,1,(1<<n)-1){
		rep(i,1,n)if(!(S&(1<<(i-1)))){
			int p=1;
			rep(ed,q[i],200){
				while(t[i][p]<=ed)p++;
				rep(j,1,n)if(S&(1<<(j-1))){
					if(ed-dis[i][j]>=0)ckmx(f[i][S|(1<<(i-1))][ed],g[j][S][ed-dis[i][j]]+w[i][p]);
				}
				g[i][S|(1<<(i-1))][ed]=max(g[i][S|(1<<(i-1))][ed-1],f[i][S|(1<<(i-1))][ed]);
			}
			rep(j,1,n)if(S&(1<<(j-1))){
				ckmx(f[i][S|(1<<(i-1))][201],g[j][S][201]+w[i][d[i]+1]);
			}
			g[i][S|(1<<(i-1))][201]=max({g[i][S|(1<<(i-1))][200],f[i][S|(1<<(i-1))][201]});
		}
	}
	int ans=0;
	rep(i,1,n)rep(j,0,201)ckmx(ans,f[i][(1<<n)-1][j]);
	write(ans);
}
bool Med;
signed main(){
//	freopen(".in","r",stdin);freopen(".out","w",stdout);
//	fprintf(stderr,"%.3lfMB\n",(&Mbg-&Med)/1048576.0);
	int _=1;while(_--)solve_the_problem();
}
/*
3 2
1 2 1
2 3 1
1 3 3
1
2
5 1
1
4
5 4
1
4
5 1
*/

标签:Gym104095L,rep,rd,define,外卖,time,include,dis
From: https://www.cnblogs.com/dcytrl/p/17994167

相关文章

  • 构建外卖跑腿系统:技术实现与架构设计
    在当今数字化时代,外卖跑腿系统已成为人们生活中不可或缺的一部分。本文将探讨如何利用先进的技术和架构设计,开发一个高效、可靠的外卖跑腿系统。1.技术选型在开发外卖跑腿系统之前,我们需要仔细选择适合的技术栈,以确保系统的稳定性和扩展性。后端开发:使用Node.js、Express框架作为......
  • R语言Pearson相关性分析降雨量和“外卖”谷歌搜索热度google trend时间序列数据可视化
    全文链接:http://tecdat.cn/?p=31608原文出处:拓端数据部落公众号GoogleTrends,即谷歌趋势。谷歌趋势是谷歌旗下一款基于搜索数据推出的一款分析工具。它通过分析谷歌搜索引擎每天数十亿的搜索数据,告诉用户某一关键词或者话题各个时期下在谷歌搜索引擎中展示的频率及其相关统计数......
  • 外卖项目again
    一、开发环境html文件夹-----sky文件夹----前端工程打包之后的效果。运行nginx服务器(端口号默认80,双击即启动),前端环境相当于就已经具备了。注意:nginx文件夹必须放在没有中文的目录中,才可正常启动。启动nginx服务器:双击nginx.exe启动,nginx端口号默认80,所以直接输入localhost就......
  • 外卖:怎么点才健康?
    你平常点外卖吗?反正我一周怎么也要点上三四次,今天中午手术错过了食堂的饭点,明天晚上加班到家晚了,周末孩子们想换个口味了,都可以来一单。碰上大雪天、大风天,外卖小哥就是我们心中的希望。遥想当年没有外卖的日子,哪个医生的抽屉里不塞几包方便面?外卖真是实实在在地提高了我们生活质......
  • 构建高效外卖配送系统:技术要点与示例代码
    随着外卖服务的普及,构建一个高效的外卖配送系统成为餐饮业务成功的关键。在这篇文章中,我们将探讨外卖配送系统的关键技术要点,并提供一些示例代码,演示其中的一些实现方法。1.订单处理与管理在外卖配送系统中,订单处理是一个核心环节。以下是一个简化的订单类的示例代码,用Python语言......
  • 基于ssm的外卖点餐系统
    现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本外卖点餐系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的......
  • 新手学习指南:用Scala采集外卖平台
    学习爬虫不是一蹴而就的,在掌握相关的知识点的同时,还要多加练习,学习是一部分,更多的还是需要自己上手操作,这里配合自己学习的基础,以及使用一些爬虫的专有库,就可以轻松达到自己想要的数据。那么今天我将用Scala编程一个爬外面平台的代码,并且做了相关的注释,希望能帮助更多的人。在Scala......
  • 项目经验还写外卖和商城?来看看异构数据源数据流转服务DatalinkX
     前言作为一个年迈的夹娃练习生,每次到了春招秋招面试实习生时都能看到一批简历,十个简历里得有七八个是写商城或者外卖项目。不由得想到了我大四那会,由于没有啥项目经验,又想借一个质量高点的项目通过简历初筛,就找到了谷粒商城,面对408集的视频教程实在是难以坚持到终点。。。并且很......
  • 点餐系统源码(小程序+APP+H5)-外卖-点餐-餐饮
     PHP点餐系统是餐营业管理的“机械”部分。它们是获取我们的预测、实际订单、安全库存和订单数量并将其转换为采购订单或生产订单的程序。由于其机械性质,订购系统并没有太多理论。但这并不意味着您不需要了解一些事情。PHP点餐系统是一种基于Web的应用程序,旨在帮助餐厅和餐馆管......
  • 外卖系统开发:构建高效、安全的外卖平台
    在当今数字化时代,外卖系统成为了餐饮行业不可或缺的一部分。本文将介绍如何使用一些主流的技术和代码片段来开发一个简单而功能强大的外卖系统。1.技术选择在开始外卖系统的开发之前,首先需要选择合适的技术栈。以下是一个常见的技术栈:后端开发:使用Node.js构建后端服务器,Express框......