Dashboard - Codeforces Round 916 (Div. 3) - Codeforces
A. Problemsolving Log
题目大意:给定一个长度为n的字符串,对于每次出现的字符’x',代表思考这个‘x’问题1秒,对于‘A’问题至少需要1秒才能解决,‘B’问题需要2秒·······‘Z'问题需要26秒,判断可以解决多少问题
从头往后跑一遍,暴力更新即可。
int n;
cin >> n;
string s;
cin >> s;
map<char, int> mp;
for (int i = 0; i < n; i++) {
mp[s[i]]++;
}
int ans = 0;
for (char i = 'A'; i <= 'Z'; i++) {
if (mp[i] >= i - 'A' + 1) ans++;
}
cout << ans << '\n';
B. Preparing for the Contest
题目大意:给定一个n和k,需要找到一个长度为n的数组a,且a内的数为1~n,满足a【t】<a【t+1】的数量为k
分析一下发现,所需要找的即为长度为k+1的上升序列,后面的为下降序列
那么,前k个数让它依次上升,第k+1个数设置为最大, 后面让它依次下降则可以找到满足的数组
int n, k;
cin >> n >> k;
if (k == 0) {
for (int i = 1; i <= n; i++) cout << n - i + 1 << ' ';
cout << '\n';
} else {
for (int i = 1; i <= k; i++) {
cout << i << ' ';
}
for (int i = n; i > k; i--) {
cout << i << ' ';
}
cout << '\n';
}
C. Quests
题目大意:给定两个数组a,b,对于每个任务 i,第一次完成时获得经验a【i】,之后完成该任务获得b【i】,能够做第 i 个任务的前提条件是 i 之前的每个任务都完成了至少一次,要求完成k次任务能获得的最大经验
对于每个任务节点,我们可以记录之前的每个节点的b的值的最大值,在每次决定是要选择向下走还是完成重复的任务节点时,选择两者相比较大的一个
int dfs(int i, int now, int maxx) {
if (i > n || now <= 0) return 0;
maxx = max(b[i], maxx);
int x = dfs(i + 1, now - 1, maxx);
int y = maxx * (now - 1);
return a[i] + max(x, y);
}
cin >> n >> k;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++) cin >> b[i];
cout << dfs(1, k, 0) << '\n';
D. Three Activities
题目大意:某位时间管理大师想要陪朋友玩,共三个项目,每个项目每天玩的朋友不同,该时间管理大师一天只能玩一个项目,他想要一起玩的朋友最大化
可以发现对于每个项目,我们只需要知道这个项目玩的人数最多的三天
共三个项目,那么就是九个数据
对于这九个数据,首先判断其中是不是有天数相同的,先排除掉,然后找到他们组合之后获得的最大值即可
const int N = 2e5 + 10;
int a[N], b[N], c[N];
bool st[N];
pair<int, int> p1[N], p2[N], p3[N];
#define x first
#define y second
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
p1[i] = {a[i], i};
}
for (int i = 1; i <= n; i++) {
cin >> b[i];
p2[i] = {b[i], i};
}
for (int i = 1; i <= n; i++) {
cin >> c[i];
p3[i] = {c[i], i};
}
sort(p1 + 1, p1 + 1 + n);
sort(p2 + 1, p2 + 1 + n);
sort(p3 + 1, p3 + 1 + n);
int ans = 0;
for (int i = n; i >= n - 2; i--) {
for (int j = n; j >= n - 2; j--) {
for (int k = n; k >= n - 2; k--) {
if (p1[i].y == p2[j].y || p1[i].y == p3[k].y || p2[j].y == p3[k].y)
continue;
ans = max(ans, p1[i].x + p2[j].x + p3[k].x);
}
}
}
cout << ans << '\n';