• codeforces 979B Treasure Hunt


    题意:

    给出三个字符串,每个字符串长度相同,给出n,要求在n轮内,每一个字符串必须改变一个字符。

    问最后哪个字符串中拥有最多相同的字符,即美丽度最大。

    思路:

    首先,很不容易想到的一点是从a变到a,有两种方式a -> 其它 -> a,或者a -> 其它 -> 其它 -> a,即变2次或者变3次。

    变3次是有意义的,比如第86个样例(wa在第86):

    3

    aaaaa

    aaaaa

    aaaab

    答案是draw

    因为第一个选一个a变3次变回a,第二个同理,第三个b到a再到b再到a就可以了,所以可以相同,这里存在一个误区。

    根据这一组数据发现,唯一可能变少的情况就是这个字符串全部字母相同并且n = 1,那么最后的美丽度要减一,比如aaaaa,只能变一个,所以美丽度减一。

    其它情况按照普通情况处理就好了。

    相加大于len的直接取为len就ok。

    代码:

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <algorithm>
     4 #include <map>
     5 #include <set>
     6 using namespace std;
     7 const int N = 1e5 + 10;
     8 char a[N],b[N],c[N];
     9 map<char,long long> as,bs,cs;
    10 int main()
    11 {
    12     long long n;
    13     scanf("%lld",&n);
    14     scanf("%s",a);
    15     scanf("%s",b);
    16     scanf("%s",c);
    17     int len = strlen(a);
    18     for (int i = 0;i < len;i++)
    19     {
    20         as[a[i]]++;
    21     }
    22     for (int i = 0;i < len;i++)
    23     {
    24         bs[b[i]]++;
    25     }
    26     for (int i = 0;i < len;i++)
    27     {
    28         cs[c[i]]++;
    29     }
    30     long long aa = 0,bb = 0,cc = 0;
    31     if (as.size() == 1 && n == 1)
    32     {
    33         aa = len - 1;
    34     }
    35     else
    36     {
    37         for (auto it = as.begin();it != as.end();++it)
    38         {
    39             aa = max(aa,it -> second + n);
    40         }
    41         if (aa > len) aa = len;
    42     }
    43     if (bs.size() == 1 && n == 1)
    44     {
    45         bb = len - 1;
    46     }
    47     else
    48     {
    49         for (auto it = bs.begin();it != bs.end();++it)
    50         {
    51             bb = max(bb,it -> second + n);
    52         }
    53         if (bb > len) bb = len;
    54     }
    55     if (cs.size() == 1 && n == 1)
    56     {
    57         cc = len - 1;
    58     }
    59     else
    60     {
    61         for (auto it = cs.begin();it != cs.end();++it)
    62         {
    63             cc = max(cc,it -> second + n);
    64         }
    65         if (cc > len) cc = len;
    66     }
    67     long long ans = max(aa,bb);
    68     ans = max(ans,cc);
    69     int cnt = 0;
    70     int ma = -1;
    71     if (aa == ans)
    72     {
    73         cnt++;
    74         ma = 1;
    75     }
    76     if (bb == ans)
    77     {
    78         cnt++;
    79         ma = 2;
    80     }
    81     if (cc == ans)
    82     {
    83         cnt++;
    84         ma = 3;
    85     }
    86     //printf("%d*
    ",ma);
    87     if (cnt >= 2) puts("Draw");
    88     else
    89     {
    90         if (ma == 1) puts("Kuro");
    91         if (ma == 2) puts("Shiro");
    92         if (ma == 3) puts("Katie");
    93     }
    94     return 0;
    95 }
  • 相关阅读:
    String类
    try catch异常捕获
    while循环语句
    编程中穷举法的运用
    for循环例题
    编程中的 if ()else() 语句
    代位符
    运算符_及_运算符优先级
    C#中的类型转换
    Asp.net基础知识
  • 原文地址:https://www.cnblogs.com/kickit/p/9038992.html
Copyright © 2020-2023  润新知