Codeforces1301 D Time to Run

(搬运一下部分官方题解)

Description

link

或者洛谷link

到时候就有中文翻译了,不过这个题机翻没毛病

Solution

首先这是一道模拟题……

不要管题目中的循环移动的问题,直接按照怎么着走能走最长

其实比较直观的就是一直走到右边,然后向下,再到左边……

到最低行最后一个的时候就原路返回(我比赛的时候真么想的)

但是我们就忽略掉了纵着来的路径

所以我们在非首行中应该把上下的路径补掉

就是把 \((L/R)\) 改成 \(UD(L/R)\)

然后还得每一行进行原路返回(就是每一次都从最左边进入下一行)

如果所有的这些路径个数加起来都不够,就 \(puts("NO")\)

这个题细节还是比较多……

Code

#include<bits/stdc++.h>
using namespace std;
#define int long long
namespace yspm{
    inline int read()
    {
        int res=0,f=1; char k;
        while(!isdigit(k=getchar())) if(k=='-') f=-1;
        while(isdigit(k)) res=res*10+k-'0',k=getchar();
        return res*f;
    }
    const int N=1e5+10;
    vector<pair<int,string> > vec1,vec2;
    int n,m,k,sum,now; string tmp;
    inline void fix(vector<pair<int,string> >&vec)
    {
        vec2=vec; vec.clear(); int sz=vec2.size();
        for(int i=0;i<sz;++i) if(vec2[i].first) vec.push_back(vec2[i]); return ;
    }
    signed main()
    {
        n=read(); m=read(); k=read();
        for(int i=1;i<=n;++i)
        {
            vec1.push_back(make_pair(m-1,"R")); 
            if(i==1) vec1.push_back(make_pair(m-1,"L"));
            else vec1.push_back(make_pair(m-1,"UDL")); 
            if(i==n) vec1.push_back(make_pair(n-1,"U"));
            else vec1.push_back(make_pair(1,"D"));
        }   
        int sz=vec1.size(); for(int i=0;i<sz;++i){sum+=vec1[i].first*vec1[i].second.size();}
        if(sum<k) return puts("NO"),0;
        while(sum>k) 
        {
            tmp=vec1.back().second; now=vec1.back().first*vec1.back().second.size();
            vec1.pop_back(); sum-=now; 
            if(sum>=k) continue; now=k-sum;
            if(now/tmp.size()>0) vec1.push_back(make_pair(now/tmp.size(),tmp));
            tmp.resize(now%tmp.size()); 
            if(tmp.size()>0) vec1.push_back(make_pair(1,tmp));
            sum=k;
        } puts("YES"); fix(vec1);
        sz=vec1.size(); printf("%lld\n",sz); 
        for(int i=0;i<sz;++i) printf("%lld %s\n",vec1[i].first,vec1[i].second.c_str()); 
        return 0;
    }
}
signed main(){return yspm::main();} 

猜你喜欢

转载自www.cnblogs.com/yspm/p/12315873.html