题面:https://codeforces.com/contest/1294/problem/B
题目大意:
机器人从(0,0)开始,他只能往上‘U‘或者往右‘R‘走
坐标系中有着很多包裹,分别在一些点上
机器人需要走过去把这些包裹全部收集起来
问能不能做到
如果能,再输出移动方式,相同移动方式输出字典序最小的方案
解题思路:
pair或者结构体排序,x与y的优先级任意,因为下一个包裹必定在当前机器人位置右方/上方/右上方
否则直接输出NO,表示不可能存在这种移动方式
在输出移动方式时,注意能先用‘R‘就用‘R‘,因为‘U‘的字典序比‘R‘大(即先右再上)
按照上述模拟即可
1 /* 2 Written By StelaYuri 3 On 2020/01/22 4 */ 5 #include<bits/stdc++.h> 6 using namespace std; 7 typedef pair<int,int> P; 8 P pnt[1050];//使用pair默认先x再y 9 string ans; 10 void add(int up,int right){ 11 int i; 12 for(i=0;i<right;i++) 13 ans+="R"; 14 for(i=0;i<up;i++) 15 ans+="U"; 16 }//先R再U 17 void solve(){ 18 int n,i; 19 ans=""; 20 cin>>n; 21 pnt[0]=P(0,0); 22 for(i=1;i<=n;i++) 23 cin>>pnt[i].first>>pnt[i].second; 24 sort(pnt+1,pnt+1+n); 25 for(i=1;i<=n;i++){ 26 if(pnt[i].first>pnt[i-1].first&&pnt[i].second<pnt[i-1].second){//如果下一个点x比当前点大,而y比当前点小,明显不存在 27 cout<<"NO\n"; 28 return; 29 } 30 add(pnt[i].second-pnt[i-1].second,pnt[i].first-pnt[i-1].first); 31 } 32 cout<<"YES\n"<<ans<<‘\n‘; 33 } 34 int main(){ 35 ios::sync_with_stdio(0); 36 cin.tie(0);cout.tie(0); 37 int T;cin>>T; 38 while(T--) 39 solve(); 40 41 return 0; 42 }
原文地址:https://www.cnblogs.com/stelayuri/p/12230006.html
时间: 2024-11-08 11:22:20