zoukankan      html  css  js  c++  java
  • 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 }


     

  • 相关阅读:
    JFinal连接多个数据库
    ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061) net start mysql服务名无效
    oracle中文显示为问号
    IDEA开发环境的设置约定
    WSL distro导入导出
    Linux服务器的x11图形模式方式远程管理参考
    WSL Linux 的 Windows 子系统[笔记]
    devops-cd之esxi和docker实战
    devops-cd之vagrant virtualbox实战
    ansible高级使用知识点
  • 原文地址:https://www.cnblogs.com/ECJTUACM-873284962/p/6375508.html
Copyright © 2011-2022 走看看