ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

「美团 CodeM 初赛 Round B」送外卖2

2022-01-11 16:31:22  阅读:144  来源: 互联网

标签:bin 状态 return int 美团 初赛 外卖 tt


思路:
题目要求最多能送多少个外卖,不妨转换思路,求怎么在相同的送外卖情况下花最少的时间。
这种解法不仅便于设计程序,而且正确性显然:求出这个状态的最小时间,就越有可能转移到能取最优值的那个状态上面。

于是使用利于理解的记忆化dfs,记录当前点是哪个,各包裹的状态(0/1/2,0表示没动,1表示拿在手上,2表示送完),然后再图上乱走,只要能标1就标1,标了1以后才能标2。在这个求到达各状态的min时间的同时记录最大的送外卖数。

难点还是在状态和转移的设计上。

code:

#include<bits/stdc++.h>
using namespace std;
const int N=21;
int n,m,q;
int f[N][59050*3];
int bin[11];
int g[N][N];
int s[N],t[N],l[N],r[N];
int ans,xx; 
int get (int x)
{
	int tt=0;
	for (int u=10;u>=0;u--){
		if (x>=bin[u]*2) tt++;
		while (x>=bin[u]) x-=bin[u];
	}
	return tt;
}
int check (int x,int y)//x的第y位是0,1,2中的哪一个{
	for (int u=10;u>y;u--)
		while (x>=bin[u]) 
			x=x-bin[u];
	if (x>=bin[y]*2) return 2;
	if (x>=bin[y]) return 1;
	return 0;
} 
void dfs (int now,int x,int z)//现在在哪一个点,物品的状态,现在的时间 
{ 
	for (int u=1;u<=q;u++){
		if (s[u]==now&&check(x,u)==0&&z>=l[u])//这里可取
			x=x+bin[u];
	}
        for (int u=1;u<=q;u++){
		if (t[u]==now&&check(x,u)==1&&z<=r[u])//这里可放
			x=x+bin[u];
	}
	if (f[now][x]<=z) return ;
	f[now][x]=z; 
	ans=max(ans,get(x));


	if (z>=xx) return ;
	for (int u=1;u<=q;u++)
	{ 
  	        if (check(x,u)==0)  dfs(s[u],x,max(z+g[now][s[u]],l[u]));//速速去取
		if (check(x,u)==1) dfs(t[u],x,z+g[now][t[u]]);//速速去放
	}


}


int main(){
	bin[0]=1;
    for(int u=1;u<=10;u++)
       bin[u]=bin[u-1]*3; 
	
    memset(f,127,sizeof(f));
	memset(g,63,sizeof(g));
	
    scanf("%d%d%d",&n,&m,&q);

	for (int u=1;u<=n;u++) g[u][u]=0;
	
    for (int u=1;u<=m;u++){
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		g[x][y]=min(g[x][y],z);
	}
	for (int k=1;k<=n;k++)//求最短路,k循环在最外层
		for (int u=1;u<=n;u++)
			for (int i=1;i<=n;i++)
				g[u][i]=min(g[u][i],g[u][k]+g[k][i]);


	for (int u=1;u<=q;u++){
		scanf("%d%d%d%d",&s[u],&t[u],&l[u],&r[u]);
		xx=max(xx,r[u]);
	}

	dfs(1,0,0);
	printf("%d\n",ans);

	return 0;
}

标签:bin,状态,return,int,美团,初赛,外卖,tt
来源: https://www.cnblogs.com/GUOGaby/p/15788929.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有