A.Problem Generator(遍历)
题意:
弗拉德计划在下个月举行 m m m轮比赛。每轮比赛应包含一个难度为"A"、“B”、“C”、“D”、“E”、"F"和"G"的问题。
弗拉德已经有了一个 n n n个问题的问题库,其中第 i i i个问题的难度为 a i a_i ai。这些问题可能不够多,所以他可能需要再想出一些问题。
弗拉德想要尽可能少地提出问题,所以他要求你找出他需要提出的问题的最小数量,以便举行 m m m轮比赛。
例如,如果 m = 1 m=1 m=1、 n = 10 n=10 n=10、 a = a= a='BGECDCBDEDBGECDCBDED",那么他需要提出两道难题:一道难度为"A",一道难度为"F"。
分析:
每个比赛都应该包含"A"、“B”、“C”、“D”、“E”、"F"和"G"的问题。遍历数据,暴力模拟统计需要加入的题目即可。
代码:
#include<bits/stdc++.h>
typedef long long LL;
using namespace std;
const LL N = 2e5 + 10;
int T, n, m;
char a[N];
map<char, int> k;
int main() {
cin >> T;
while (T--) {
k.clear();
cin >> n >> m;
cin >> a + 1;
for (int i = 1; i <= n; i++) {
k[a[i]]++;
}
int cnt = 0;
for (char i = 'A'; i <= 'G'; i++) {
cnt += max(0, m - k[i]);
}
cout << cnt << endl;
}
return 0;
}
B.Choosing Cubes(思维)
题意:
德米特里有 n n n个立方体,从左到右编号为 1 1 1至 n n n。索引为 f f f的立方体是他的最爱。
德米特里把所有的立方体都扔到了桌子上,第 i i i个立方体显示了值 a i a_i ai( 1 ≤ a i ≤ 100 1\le a_i\le 100 1≤ai≤100)。之后,他按照数值从大到小的非递增顺序排列这些立方体。如果两个立方体的数值相同,它们可以按照任意顺序排列。
排序后,德米特里取出了第一个 k k k立方体。然后,他开始关注自己是否取出了最喜欢的立方体(注意,排序后立方体的位置可能会发生变化)。
例如,如果 n = 5 n=5 n=5、 f = 2 f=2 f=2、 a = [ 4 , 3 , 3 , 2 , 3 ] a=[4,\color{green}3,3,2,3] a=[4,3,3,2,3](最喜欢的立方体用绿色标出)和 k = 2 k=2 k=2,可能会发生以下情况:
- 在对 a = [ 4 , 3 , 3 , 3 , 2 ] a=[4,\color{green}3,3,3,2] a=[4,3,3,3,2]排序后,由于最喜爱的立方体最终排在了第二位,因此它将被移除。
- 在对 a = [ 4 , 3 , 3 , 3 , 2 ] a=[4,3,\color{green}3,3,2] a=[4,3,3,3,2]排序后,由于最喜爱的魔方排在了第三位,因此它不会被移除。
分析:
我们只需要检查排完序之后比较在 k k k位置的立方体 a k a_k ak与最喜欢的立方体 a f a_f af的大小即可,如果 a k > a f a_k\gt a_f ak>af,说明 a f a_f af的位置在 k k k之前,一定会被删;如果 a k < a f a_k\lt a_f ak<af,说明 a f a_f af的位置在 k k k之后,一定不会被删;如果 a k = a f a_k=a_f ak=af,检查 a k + 1 a_{k+1} ak+1,如果 a k + 1 = a f a_{k+1}=a_f ak+1=af,则有可能被删,否则一定被删。
代码:
#include<bits/stdc++.h>
using namespace std;
void solve() {
int n, f, k;
cin >> n >> f >> k;
vector<int> a(n + 1);
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
int fa = a[f];
sort(a.begin() + 1, a.end(), greater<int>());
if (k == n)
cout << "YES" << endl;
else if (fa > a[k])
cout << "YES" << endl;
else if (fa < a[k])
cout << "NO" << endl;
else {
if (a[k + 1] == fa)
cout << "MAYBE" << endl;
else
cout << "YES" << endl;
}
}
int main() {
int t;
cin >> t;
while (t--) {
solve();
}
return 0;
}
C.Sofia and the Lost Operations(思维)
题意:
索菲亚有一个由 n n n个整数 a 1 , a 2 , … , a n a_1,a_2,\ldots,a_n a1,a2,…,an组成的数组。有一天,她对这个数组感到厌倦,于是决定依次对它进行 m m m次修改操作。
每个修改操作都由一对数字