zoukankan      html  css  js  c++  java
  • [CF1073C] Vasya and Robot

    Description

    在平面直角坐标系中,一个机器人处于 $ (0,0) $ 点。它能进行以下的移动操作。$ U~~ $ 从 $ (x,y) $ 移动到 $ (x,y+1) (;) D~~ $ 从 $ (x,y) $ 移动到 $ (x,y-1) (;) L~~ $ 从 $ (x,y) $ 移动到 $ (x-1,y) (;) R~~ $ 从 $ (x,y) $ 移动到 $ (x+1,y) $。现在有一个长度为 $ n $ 的操作序列。Vasya想修改这个序列使机器人最终移动到 $ (x,y) $。其修改的花费为 $ maxID-minID+1 (。) maxID $ 是修改的操作的下标的最大值,$ minID $ 是修改的操作的下标的最小值。如果没有修改,则花费为 $ 0 $。

    Solution

    考虑到对于一个区间,如果它可行,那么一个包含它的区间一定可行

    故尺取法即可

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    const int N = 1000005;
    
    int n,x,y,ans=1e9;
    char s[N];
    
    signed main() {
        ios::sync_with_stdio(false);
        cin>>n>>s+1>>x>>y;
        if((abs(x)+abs(y))%2!=n%2) {
            cout<<-1;
            return 0;
        }
        int j=1;
        for(int i=1;i<=n;i++) {
            if(s[i]=='U') y--;
            if(s[i]=='D') y++;
            if(s[i]=='L') x++;
            if(s[i]=='R') x--;
        }
        for(int i=0;i<=n;i++) {
            if(s[i]=='U') y--;
            if(s[i]=='D') y++;
            if(s[i]=='L') x++;
            if(s[i]=='R') x--;
            j=max(j,i+1);
            while(j<=n && abs(x)+abs(y)>j-i-1) {
                if(s[j]=='U') y++;
                if(s[j]=='D') y--;
                if(s[j]=='L') x--;
                if(s[j]=='R') x++;
                ++j;
            }
            //cout<<i<<" "<<j<<endl;
            if(abs(x)+abs(y)<=j-i-1) ans=min(ans,j-i-1);
        }
        cout<<(ans>1e8?-1:ans);
    }
    
  • 相关阅读:
    UVA-10917 Walk Through the Forest (dijkstra+DP)
    UVA-11374 Airport Express (dijkstra+枚举)
    UVA-11294 Wedding (2-SAT)
    UVALive-3713 Astronauts (2-SAT)
    UVALive-3211 Now or later (2-SAT+二分)
    线程变量
    linux通用双向链表
    排序算法代码
    双向链表
    long与int的区别?(zz)
  • 原文地址:https://www.cnblogs.com/mollnn/p/12838806.html
Copyright © 2011-2022 走看看