题目大意:
机器人从(0,0)开始,他只能往上'U'或者往右'R'走
坐标系中有着很多包裹,分别在一些点上
机器人需要走过去把这些包裹全部收集起来
问能不能做到
如果能,再输出移动方式,相同移动方式输出字典序最小的方案
解题思路:
pair或者结构体排序,x与y的优先级任意,因为下一个包裹必定在当前机器人位置右方/上方/右上方
否则直接输出NO,表示不可能存在这种移动方式
在输出移动方式时,注意能先用'R'就用'R',因为'U'的字典序比'R'大(即先右再上)
按照上述模拟即可
#include<bits/stdc++.h> using namespace std; typedef pair<int,int> P; P pnt[1050];//使用pair默认先x再y string ans; void add(int up,int right){ int i; for(i=0;i<right;i++) ans+="R"; for(i=0;i<up;i++) ans+="U"; }//先R再U void solve(){ int n,i; ans=""; cin>>n; pnt[0]=P(0,0); for(i=1;i<=n;i++) cin>>pnt[i].first>>pnt[i].second; sort(pnt+1,pnt+1+n); for(i=1;i<=n;i++){ if(pnt[i].first>pnt[i-1].first&&pnt[i].second<pnt[i-1].second){//如果下一个点x比当前点大,而y比当前点小,明显不存在 cout<<"NO "; return; } add(pnt[i].second-pnt[i-1].second,pnt[i].first-pnt[i-1].first); } cout<<"YES "<<ans<<' '; } int main(){ ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); int T;cin>>T; while(T--) solve(); return 0; }