A

题意:字符串中计数每个字符 A, B, C, 和 D,但每个字符的计数不超过 x

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
#include <iostream>
#include <string>
using namespace std;

typedef long long LL;

void solve() {
int x;
cin >> x;
string s;
cin >> s;

int countA = 0, countB = 0, countC = 0, countD = 0;

for (char c : s) {
if (c == 'A' && countA < x) {
countA++;
} else if (c == 'B' && countB < x) {
countB++;
} else if (c == 'C' && countC < x) {
countC++;
} else if (c == 'D' && countD < x) {
countD++;
}
}

int total = countA + countB + countC + countD;
cout << total << endl;
}

int main() {
int n;
cin >> n;
while (n--) {
solve();
}
return 0;
}

B

题意:

给定一个正整数数组,要求通过若干次操作使得数组中的所有元素具有相同的奇偶性(即全部是奇数或全部是偶数)。

原本我使用的是模拟,但是当有最大偶数时,没有考虑清楚,即:

择任意奇数与最大的偶数操作两次,可以造出一个比任何偶数都大的奇数,再使用该奇数操作即可。

Codeforces Round 963 (Div. 2) - Luckyblock - 博客园 (cnblogs.com)

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
47
48
49
50
51
52

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

typedef long long LL;
const int N = 2e5 + 10;
LL arr[N];
void solve() {
int num;
cin >> num;
vector<LL> vec;
LL maxodd = 0;
for (int i = 0; i < num; i++) {
cin >> arr[i];
}

for (int i = 0; i < num; i++) //统计奇数偶数
{
if (arr[i] % 2 == 0)
vec.push_back(arr[i]);
if (arr[i] % 2 == 1 && arr[i] > maxodd)
maxodd = arr[i];
}
if (vec.size() == num || vec.empty()) //全为奇数或者偶数
{
cout << 0 << endl;
return;
}
int ans = vec.size();
sort(vec.begin(), vec.end());
int flag = 0;
for (auto x : vec) {
if (x < maxodd)
maxodd = x + maxodd;
else
flag =
1; //择任意奇数与最大的偶数操作两次,可以造出一个比任何偶数都大的奇数,再使用该奇数操作即可
}

cout << ans + flag << "\n";
}

int main() {
int n;
cin >> n;
while (n--) {
solve();
}
}