• Codeforces 1073C Vasya and Robot 【二分】


    <题目链接>

    题目大意:

    一个机器人从(0,0)出发,输入一段指令字符串,和机器人需要在指定步数后到达的终点,问如果机器人需要在指定步数内到达终点,那么需要对原指令字符串做出怎样的改变,假设改变 字符串的最大下标为maxindex,改变字符串的最小下标为minindex,输出最小的 maxindex-minindex+1,即,输出最小的改变字符串的区间长度(该区间内的字符不一定要全部发生改变)。

    解题分析:

    本题可用二分答案求解,先预处理得到x,y的前缀和,即原始指令字符串对x,y的改变所作出的贡献,然后就是二分答案了,二分最短区间的长度。当然,二分答案最重要的就是check()函数,枚举所有长度为mid的区间,利用前缀和计算出理论上该区间x,y恰好所需的改变,然后判断该区间是否能够符合,具体步骤见代码。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int N =1e6+10;
     4 int n,x,y;
     5 char s[N];
     6 int sx[N],sy[N];
     7 
     8 bool check(int m){
     9     for(int i=1;i+m-1<=n;i++){  //枚举所有长度为m的区间
    10         int xx=sx[n]-sx[i+m-1]+sx[i-1];     
    11         int yy=sy[n]-sy[i+m-1]+sy[i-1];
    12         //得到不需要改变的区间中,对x,y的数值所作出的贡献
    13         int tx=x-xx;
    14         int ty=y-yy;
    15         //求出该需要改变的区间中,x和y想要到达终点,所需恰好作出的贡献
    16         if(abs(tx)+abs(ty)<=m && (m-abs(tx)-abs(ty))%2==0) //(abs(tx)+abs(ty)位字符做出使该人刚好到达终点的贡献,剩下位的字符如果是偶数,那么就可以让其走的路程两两抵消,从而达到刚好到达终点的效果)
    17             return true;
    18     }
    19     return false;
    20 }
    21 int main(){
    22     scanf("%d",&n);
    23     scanf("%s",s+1);
    24     scanf("%d%d",&x,&y);
    25     sx[0]=0;sy[0]=0;
    26     for(int i=1;i<=n;i++){
    27         sx[i] = sx[i - 1] + (s[i] == 'L' ? -1 : (s[i] == 'R' ? 1 : 0));
    28         sy[i] = sy[i - 1] + (s[i] == 'D' ? -1 : (s[i] == 'U' ? 1 : 0));
    29     }
    30     //求出按照原始序列走,x和y的前缀和
    31     int l=0,r=n;
    32     int ans=-1;
    33     while(l<=r){    //二分答案,枚举需要改变的最短区间长度
    34         int mid=(l+r)>>1;
    35         if(check(mid))ans=mid,r=mid-1;   //如果该区间长度符合,就继续二分,看更短的区间是否符合
    36         else l=mid+1;
    37     }
    38     if(ans==-1)puts("-1");
    39     else printf("%d
    ",ans);
    40     return 0;
    41 }

    2018-10-27

  • 相关阅读:
    LDA的整体流程
    java中字符串的用法
    verification Code
    properties
    Hash
    substring的问题
    LDA和PLSA的区别
    Step By Step(Lua环境)
    Step By Step(Lua调用C函数)
    Step By Step(Lua弱引用table)
  • 原文地址:https://www.cnblogs.com/00isok/p/9863528.html
Copyright © 2020-2023  润新知