Codeforces1301D Time to Run

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

Description

link

或者洛谷link

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

Solution

首先这是一道模拟题……

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

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

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

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

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

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

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

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

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

Code

#include
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 > vec1,vec2;
    int n,m,k,sum,now; string tmp;
    inline void fix(vector >&vec)
    {
        vec2=vec; vec.clear(); int sz=vec2.size();
        for(int i=0;ik) 
        {
            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

你可能感兴趣的:(Codeforces1301D Time to Run)