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);
    }
    
  • 相关阅读:
    JAVA数组复制和扩容
    Nginx-fastdfs安装与配置
    ssh安全免密登录
    修改Linux默认源
    Linux查看IP
    整合ssm框架
    Java-maven-shangcheng-parent-web-配置
    Java-maven-shangcheng-manager-service-配置
    Java-maven-shangcheng-manager-配置
    jquery美化select,自定义下拉框样式
  • 原文地址:https://www.cnblogs.com/mollnn/p/12838806.html
Copyright © 2011-2022 走看看