CodeForces 979B Treasure Hunt 【模拟】

题目大意:

3个人做游戏,每人初始时拥有一个长度相同的字符串,现每人都要对自己的字符串进行变换操作,问经过n次变换操作后谁的字符串的value最大,value的计算方法是字符串中出现次数最的的字母的次数。
变换操作是将自己字符串中的任意一个字母变成除这个字母外的任意一个字母。

解题思路:

设初始时出现次数最多的字母为m,之后我们将所有字母变成这个字母就是最佳答案了。变换时要对n进行判断,当n大于非m的字母数量时,最终答案为字符串的长度(即可以将所有字母变为m),反之,为m的数量+n。
【注意:】
这里要考虑一种情况,就是n = 1 && 所有字母都相同的时候,这时答案为字符串长度 - 1。

关于代码:

自己写的略微“丑陋”,std看起来是真的舒服,想写这样的代码。
现在对“Think twice code once”又有了新的理解,不仅要写正确的代码,还要写在表述清楚的前提下的简洁的代码。

Mycode:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std;

char a[111111], b[111111], c[111111];
map<char, int> ca, cb, cc;
int t, la, lb, lc, ra, rb, rc;
int main()
{
scanf("%d%s%s%s",&t,a, b, c);
la = strlen(a), lb = strlen(b), lc = strlen(c);
for(int i = 0; i < la; ++i) ca[a[i]]++;
for(int i = 0; i < lb; ++i) cb[b[i]]++;
for(int i = 0; i < lc; ++i) cc[c[i]]++;
for(char i = 'a'; i <= 'z'; ++i)
{
ra = max(ra, ca[i]);
rb = max(rb, cb[i]);
rc = max(rc, cc[i]);
}
for(char i = 'A'; i <= 'Z'; ++i)
{
ra = max(ra, ca[i]);
rb = max(rb, cb[i]);
rc = max(rc, cc[i]);
}
if(ra == la && t == 1) ra--; else ra += t;
if(rb == lb && t == 1) rb--; else rb += t;
if(rc == lc && t == 1) rc--; else rc += t;
ra = min(ra, la);
rb = min(rb, lb);
rc = min(rc, lc);
if(ra > rb && ra > rc)
puts("Kuro");
else if(rb > ra && rb > rc)
puts("Shiro");
else if(rc > ra && rc > rb)
puts("Katie");
else
puts("Draw");
return 0;
}

Stdcode:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <bits/stdc++.h>

using namespace std;

int a[256], b[256], c[256], n, ma, mb, mc;
string p, q, r;

int main() {
cin >> n >> p >> q >> r;
for (char x: p) ma = max(ma, ++a[x]);
for (char x: q) mb = max(mb, ++b[x]);
for (char x: r) mc = max(mc, ++c[x]);
if (n == 1 && ma == (int)p.length()) p.pop_back();
if (n == 1 && mb == (int)q.length()) q.pop_back();
if (n == 1 && mc == (int)r.length()) r.pop_back();
ma = min(ma + n, (int)p.length());
mb = min(mb + n, (int)q.length());
mc = min(mc + n, (int)r.length());
if (ma > mb && ma > mc) {
puts("Kuro");
return 0;
}
if (mb > ma && mb > mc) {
puts("Shiro");
return 0;
}
if (mc > ma && mc > mb) {
puts("Katie");
return 0;
}
puts("Draw");
return 0;
}
Donate comment here
0%