Codeforces 1294B - Collecting Packages

题目大意:

机器人从(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\n";
            return;
        }
        add(pnt[i].second-pnt[i-1].second,pnt[i].first-pnt[i-1].first);
    }
    cout<<"YES\n"<<ans<<'\n';
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int T;cin>>T;
    while(T--)
        solve();
    
    return 0;
}

 

posted @ 2020-01-23 00:12  StelaYuri  阅读(250)  评论(0编辑  收藏  举报