• Codeforces 712B Memory and Trident


    B. Memory and Trident
    time limit per test:2 seconds
    memory limit per test:256 megabytes
    input:standard input
    output:standard output

    Memory is performing a walk on the two-dimensional plane, starting at the origin. He is given a string s with his directions for motion:

    • An 'L' indicates he should move one unit left.
    • An 'R' indicates he should move one unit right.
    • A 'U' indicates he should move one unit up.
    • A 'D' indicates he should move one unit down.

    But now Memory wants to end at the origin. To do this, he has a special trident. This trident can replace any character in s with any of 'L', 'R', 'U', or 'D'. However, because he doesn't want to wear out the trident, he wants to make the minimum number of edits possible. Please tell Memory what is the minimum number of changes he needs to make to produce a string that, when walked, will end at the origin, or if there is no such string.

    Input

    The first and only line contains the string s (1 ≤ |s| ≤ 100 000) — the instructions Memory is given.

    Output

    If there is a string satisfying the conditions, output a single integer — the minimum number of edits required. In case it's not possible to change the sequence in such a way that it will bring Memory to to the origin, output -1.

    Examples
    Input
    RRU
    Output
    -1
    Input
    UDUR
    Output
    1
    Input
    RUUR
    Output
    2
    Note

    In the first sample test, Memory is told to walk right, then right, then up. It is easy to see that it is impossible to edit these instructions to form a valid walk.

    In the second sample test, Memory is told to walk up, then down, then up, then right. One possible solution is to change s to "LDUR". This string uses 1 edit, which is the minimum possible. It also ends at the origin.

    解题思路:

    【题意】
    Memory从二维坐标系的原点出发,按字符串s的指示运动

    R:向右;L:向左;U:向上;D:向下

    Memory最终想回到原点,问至少需要改变字符串s中的几个字符

    若无论如何改变都无法回到原点,输出"-1"
    【类型】
    implementation
    【分析】

    很显然的,Memory从原点出发想要回到原点

    那么他向右走的次数与向左走的次数需要一样,同时,向上走的次数和向下走的次数也必须一样

    这也就是说,向右、向左、向上、向下走的总次数必定是偶数次

    所以若字符串s长度为奇数,显然输出"-1"

    接着将向右走的次数与向左走的次数抵消,向上走的次数与向下走的次数抵消

    剩下的就只能用水平(向左、向右)的次数抵垂直(向上、向下)的次数,或垂直的次数抵水平的次数才能回到原点

    而这部分就是需要改变的字符数

    分别统计出向各个方向的步数,求出 abs(U-D)+abs(L-R) 回不到原点多余的步数。然后让 剩余的步数/2 修改一处可以保证两个状态OK

    【时间复杂度&&优化】
    O(strlen(s))

    题目链接→Codeforces Problem 712B Memory and Trident

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int main()
     4 {
     5     char s[100005];
     6     int len;
     7     int a=0,b=0,c=0,d=0;
     8     while(gets(s))
     9     {
    10         len=strlen(s);
    11     if(len%2==1)
    12     {
    13         printf("-1
    ");
    14     }
    15     else
    16     {
    17         for(int i=0;s[i]!='';i++)
    18         {
    19             if(s[i]=='U')
    20                 a++;
    21             else if(s[i]=='D')
    22                 b++;
    23                 else if(s[i]=='L')
    24                     c++;
    25                 else if(s[i]=='R')
    26                     d++;
    27         }
    28          printf("%d
    ",(abs(a-b)+abs(c-d))/2);
    29          a=b=c=d=0;
    30     }
    31     }
    32     return 0;
    33 }


     

  • 相关阅读:
    获取ip地址,
    手机div侧滑删除
    swiper左右选项卡滑动
    table-cell使用
    返回和刷新
    电脑浏览器计算高度和宽度
    css 空格
    时间js
    Nodejs仿Apache的部分功能
    Nodejs中的JavaScript
  • 原文地址:https://www.cnblogs.com/ECJTUACM-873284962/p/6375508.html
Copyright © 2020-2023  润新知