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;
}