https://vjudge.net/problem/CodeForces-1294B
题目大意:机器人初始位置为
(
0
,
0
)
(0,0)
(0,0),且它每一步只能选择向上走或者向右走,现在给出
n
n
n个包裹的位置,保证没有多个包裹在同一位置,请你输出一种字典序最小的移动方案使得机器人可以拿到所有的包裹,否则输出
N
O
NO
NO。
思路:首先考虑什么时候有解,我们把包裹按照 x x x从小到大,若 x x x相等则 y y y从小到大的规则进行排序,如果有解的话,那么从第起点开始逐一连线,得到的线一定只向右或向上延申。为了使得答案的字典序最小,那么一定要优先向右走。
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
struct node
{
int x,y;
bool operator< (const node &a)const
{
if(x==a.x)
return y<a.y;
return x<a.x;
}
}a[1005];
int t,n;
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d%d",&a[i].x,&a[i].y);
sort(a,a+n);
bool flag=1;
string ans(a[0].x,'R');
ans+=string(a[0].y,'U');
for(int i=1;i<n&&flag;i++)
{
if(a[i].x<a[i-1].x||a[i].y<a[i-1].y)
{
flag=0;
break;
}
ans+=string(a[i].x-a[i-1].x,'R');
ans+=string(a[i].y-a[i-1].y,'U');
}
if(flag)
cout<<"YES"<<'\n'<<ans<<'\n';
else
printf("NO\n");
}
return 0;
}