CF1294B Collecting Packages
题面传送门
给出\(n\)与 \(n\)个特殊点的坐标 \((x_i, y_i)\) 。
从 \((0, 0)\)出发, 只能向上和向右移动,求最优路径,或告知无解
首先最优化排序,使得其按\(x\)升序,\(x\)相同以\(y\)升序。排好后检查\(y\)是否全部升序,如果全部升序那么机器人一定可以到达,反之则不能。
那么从一个地点到另一个地点走曼哈顿距离,无论怎样都要横着走\(\left|y_i-y_j-1\right|\)步,竖着走\(\left|x_i-x_j-1\right|\)步。随便输就好了。
代码实现:
#include<cstdio>
#include<algorithm>
using namespace std;
int t,n,ans,tot,pus,flag;
struct yyy{
int x,y;
}s[1039];
inline bool cmp(yyy a,yyy b){
if(a.x==b.x) return a.y<b.y;
return a.x<b.x;
}
int main(){
register int i,j;
scanf("%d",&t);
while(t--){
flag=0;
scanf("%d",&n);
for(i=1;i<=n;i++) scanf("%d%d",&s[i].x,&s[i].y);
sort(s+1,s+n+1,cmp);
for(i=2;i<=n;i++) if(s[i].y<s[i-1].y) {flag=1;break;}
if(flag) printf("NO\n");
else{
printf("YES\n");
for(i=1;i<=n;i++){
for(j=1;j<=s[i].x-s[i-1].x;j++) putchar('R');
for(j=1;j<=s[i].y-s[i-1].y;j++) putchar('U');
}
printf("\n");
}
}
return 0;
}