Codeforces Round #605 (Div. 3)
題目鏈接:http://codeforces.com/contest/1272/problem/B
題意大意:
儘可能少的刪除無效或多餘指令,並重新排列指令使機器人從原點出發,最後回到原點,中間不能經過同一個點兩次(原點也僅能出發和結束經過)。
測試樣例:
input
6
LRU
DURLDRUDRULRDURDDL
LRUDDLRUDRUL
LLLLRRRR
URDUR
LLL
output
2
LR
14
RUURDDDDLLLUUR
12
ULDDDRRRUULL
2
LR
2
UD
0
Note
There are only two possible answers in the first test case: "LR" and "RL".
The picture corresponding to the second test case:
Note that the direction of traverse does not matter
Another correct answer to the third test case: "URDDLLLUURDR".
AC代碼:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
char s[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s",s);
int len=strlen(s);
int cnt[4];
memset(cnt,0,sizeof(cnt));
for(int i=0;i<len;i++)
{
if(s[i]=='U')
cnt[0]++;
if(s[i]=='D')
cnt[1]++;
if(s[i]=='L')
cnt[2]++;
if(s[i]=='R')
cnt[3]++;
}
int mini1=0,mini2=0;
//找到一組指令中較少個數的指令,以其個數爲標準
mini1=min(cnt[0],cnt[1]);
mini2=min(cnt[2],cnt[3]);
//若一組指中令有一個爲0,則那一組指令都爲0,且另一組兩個只能走一步
if(mini1==0&&mini2!=0)
mini2=1;
if(mini2==0&&mini1!=0)
mini1=1;
int sum=2*(mini1+mini2);
printf("%d\n",sum);
//按照自己設定的規則走,不重複且回到原點
for(int i=0;i<mini1;i++)
printf("U");
for(int i=0;i<mini2;i++)
printf("L");
for(int i=0;i<mini1;i++)
printf("D");
for(int i=0;i<mini2;i++)
printf("R");
printf("\n");
}
return 0;
}