22/5/1

两篇博客分别探讨了机器人在平面上移动的路径优化问题和旅行团选择策略。第一篇中,机器人从原点出发,根据LRUD指令移动,目标是通过最少的指令删除使机器人能返回原点且每个位置最多经过一次。第二篇涉及在有限载客量下,如何选择旅行团以最大化收益,确保途中不超载。通过深度优先搜索遍历所有可能的组合,找到合法的旅行团选择方案。
摘要由CSDN通过智能技术生成

1. cf Snow Walking Robot;2,旅行;


1,Snow Walking Robot

题意:机器人在(0,0)处,输入一串只有LRUD的字符分别表示向左右上下移动一格,合法的操作字符串是按照字符串移动完后,机器人会回到(0,0)并且除了(0,0)允许走两次,其他地方只允许走一次,否则机器人会爆炸;操作是重排操作字符的序列和删除操作,保证删除次数最小,如果无法使其合法,输出0;

很容易发现就是l=r,u=d才可以回来,而且是最小的值;对为0的情况特判;

#include<bits/stdc++.h>
#define rep1(i,a,n) for(register int i=a;i<n;i++) 
#define rep2(i,a,n) for(register int i=a;i<=n;i++) 
#define per1(i,n,a) for(register int i=n;i>a;i--) 
#define per2(i,n,a) for(register int i=n;i>=a;i--)
#define quick_cin() cin.tie(0),cout.tie(0),ios::sync_with_stdio(false)
#define INF 0x3f3f3f3f
#define pb push_back
#define endl "\n"
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
typedef double db;
string s;
void solve()
{
	unordered_map<char,int>hs;
	cin>>s;
	rep1(i,0,s.size())
	{
		hs[s[i]]++;
	}
	int minx=min(hs['R'],hs['L']);
	int miny=min(hs['U'],hs['D']);
	if(!minx&&miny)miny=1;
	else if(!miny&&minx)minx=1;
	cout<<minx*2+miny*2<<endl;
	rep2(i,1,minx)cout<<"R";
	rep2(i,1,miny)cout<<"D";
	rep2(i,1,minx)cout<<"L";
	rep2(i,1,miny)cout<<"U";
	cout<<endl;
}
signed main()
{
	quick_cin();
	int T;cin>>T;
	while(T--)solve();
	return 0;
}

2,旅行;

题意:

 看数据范围很容易想到用dfs来做,可以枚举每个团的状态:取还是不取;但是最终要面临一个问题,那就是怎么确定最终的选法是合法的,从题意来看,就是中间列车的人数不会超过v即可;所以就是一个数组zd[],选了该团,那么zd[团的起点站]+=t,zd[团的终点站]-=t,最终让1到n遍历,求和,如果中间有的和超过了v,那么说明超载了,此方案就不合法,舍弃掉,只有合法的方案才能更新答案;

#include<bits/stdc++.h>
#define rep1(i,a,n) for(ll i=a;i<n;i++) 
#define rep2(i,a,n) for(ll i=a;i<=n;i++) 
#define per1(i,n,a) for(ll i=n;i>a;i--) 
#define per2(i,n,a) for(ll i=n;i>=a;i--)
#define quick_cin() cin.tie(0),cout.tie(0),ios::sync_with_stdio(false)
#define INF 0x3f3f3f3f
#define pb push_back
#define endl "\n"
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
typedef double db;
int n,m,v;
struct node
{
	int st,ed,t,w;
}a[100];
bool hs[100];
int zd[100];
int ans;
void dfs(int u)
{
	if(u>=m+1)
	{
		int sum=0;
		memset(zd,0,sizeof zd);
		rep2(i,1,m)
		{
			if(hs[i])
			{
				zd[a[i].st]+=a[i].t;
				zd[a[i].ed]-=a[i].t;
				sum+=a[i].w;
			}
		}
		int num=0;
		bool f=1;
		rep2(i,1,n)
		{
			num+=zd[i];
			if(num>v)f=0;
		}
		if(f)ans=max(ans,sum);
		return;
	}
	hs[u]=1;
	dfs(u+1);
	hs[u]=0;
	dfs(u+1);
}
signed main()
{
	quick_cin();
	cin>>n>>m>>v;
	rep2(i,1,m)
	{	
		cin>>a[i].st>>a[i].ed>>a[i].t;
		a[i].w=a[i].t*(a[i].ed-a[i].st);
	}
	dfs(1);
	cout<<ans;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dull丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值