B. Collecting Packages
-
题目大意
一张图上有n个包裹,给出他们的坐标,一个机器人从(0,0)出发,只能向右( R )或向上( U ),问能否收集到所有包裹,如果能,给出字典序最小的路径。 -
求解思路
结构体排序+贪心
因为只能向右或上移动,因此下一个包裹必定在当前机器人位置右方,上方,右上方,否则直接输出NO,表示不可能存在这种移动方式。因为字典序要最小,所以移动时先右再上,即先输出R. -
附上代码
我是直接输出R和U,当然也可以直接存入字符串中,最后直接输出。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int INF=0x3f3f3f;
struct node{
int x,y;
}a[1010];
int cmp(node s,node m){
if(s.x==m.x)
return s.y<m.y;
else
return s.x<m.x;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--){
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i].x>>a[i].y;
sort(a+1,a+n+1,cmp);
bool flag=0;
for(int i=2;i<=n;i++){
if((a[i].x>a[i-1].x)&&(a[i].y<a[i-1].y)){
flag=1;
cout<<"NO"<<endl;
break;
}
}
if(!flag){
cout<<"YES"<<endl;
a[0].x=0;a[0].y=0;
for(int i=1;i<=n;i++){
if(a[i].x>a[i-1].x){
for(int j=0;j<(a[i].x-a[i-1].x);j++)
cout<<"R";
for(int j=0;j<(a[i].y-a[i-1].y);j++)
cout<<"U";
}
if(a[i].x==a[i-1].x){
for(int j=0;j<(a[i].y-a[i-1].y);j++)
cout<<"U";
}
}
cout<<endl;
}
}
return 0;
}