Codeforces Round #615 (Div. 3)B. Collecting Packages

B. Collecting Packages

题目链接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;
}
发布了8 篇原创文章 · 获赞 3 · 访问量 4127

猜你喜欢

转载自blog.csdn.net/Fiveneves/article/details/104081098