题目链接:B题链接
题目大意:走路收集背包,只能向右和向左走,如果不能全部收集则输出NO,否则则输出YES,并且路径要满足最短,且字典序最小。
解题思路:直走别瞎拐,排序,先走到力原点近的,会导致左拐的地和向下的点全部会导致NO,所以再进行下判断。
const int N = 10000;
struct p{
int x; int y;
}a[N];
bool cmp(struct p a, struct p b){
return a.x*a.x+a.y*a.y < b.x*b.x+b.y*b.y;
}
int main(){
int t; RD(t);
while(t--){
LL n; RD(n);
for(int i = 0; i < n; i++){
int xx, yy;
cin >> xx >> yy;
a[i].x = xx;
a[i].y = yy;
}
bool flag = true;
sort(a, a+n, cmp);
string ans = "";
for(int j = 0; j < a[0].x; j++) ans+="R";
for(int j = 0; j < a[0].y; j++) ans+="U";
for(int i = 1; i < n; i++){
if(a[i].x < a[i-1].x || a[i].y < a[i-1].y)
{
flag =false;
break;
}
for(int j = a[i-1].x; j < a[i].x; j++) ans+="R";
for(int j = a[i-1].y; j < a[i].y; j++) ans+="U";
}
if (flag){
cout << "YES\n" << ans << '\n';
}
else {
cout << "NO\n";
}
}
}