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*\n",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 }

 

posted @ 2018-05-15 03:15  qrfkickit  阅读(662)  评论(0编辑  收藏  举报