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

题面: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 }

猜你喜欢

转载自www.cnblogs.com/stelayuri/p/12230006.html