Codeforces Round 916 (Div. 3)(A-E2)
Codeforces Round 916 (Div. 3)(A-E2)
A
分析
统计一下每个字符出现的次数即可
代码
点击查看代码
void solve () {
int n; cin >> n;
string s; cin >> s;
map<int, int> mp;
for (int i = 0; i < n; i ++) {
mp[s[i] - 'A' + 1] ++;
}
int ans = 0;
for (int i = 1; i <= 26; i ++) {
if (mp[i] >= i) ans ++;
}
cout << ans << endl;
return ;
}
B Preparing for the Contest
分析
将排列翻转一部分即可
代码
点击查看代码
void solve () {
int n, k; cin >> n >> k;
vector<int> a(n + 1);
for (int i = 1; i <= n - k; i ++) a[i] = n - k - i + 1;
for (int i = n - k + 1; i <= n; i ++) a[i] = i;
for (int i = 1; i <= n; i ++) cout << a[i] << ' ';
cout << endl;
return ;
}
C Quests
分析
枚举只使用前i个,因此要做i次初始价值的任务,同时维护前缀最大值,将剩余次数全部给它,O(n)求出答案
代码
点击查看代码
void solve () {
int n, k; cin >> n >> k;
vector<ll> a(n + 1), b(n + 1);
for (int i = 1; i <= n; i ++) cin >> a[i];
for (int i = 1; i <= n; i ++) cin >> b[i];
ll ans = -INF, pre = 0, mx = -INF;
for (int i = 1; i <= min(n, k); i ++) {
pre += a[i];
mx = max(mx, b[i]);
ans = max(ans, pre + (k - i) * mx);
}
cout << ans << endl;
return ;
}
D Three Activities
分析
维护前后缀最大值,枚举每天进行哪个活动,维护最大值即可
代码
点击查看代码
void solve () {
int n; cin >> n;
vector<int> a(n + 1), b(n + 1), c(n + 1);
vector<int> p1(n + 2, 0), p2(n + 2, 0), p3(n + 2, 0);
vector<int> s1(n + 2, 0), s2(n + 2, 0), s3(n + 2, 0);
for (int i = 1; i <= n; i ++) {
cin >> a[i];
p1[i] = max(a[i], p1[i - 1]);
}
for (int i = 1; i <= n; i ++) {
cin >> b[i];
p2[i] = max(b[i], p2[i - 1]);
}
for (int i = 1; i <= n; i ++) {
cin >> c[i];
p3[i] = max(c[i], p3[i - 1]);
}
for (int i = n; i >= 1; i --) {
s1[i] = max(a[i], s1[i + 1]);
s2[i] = max(b[i], s2[i + 1]);
s3[i] = max(c[i], s3[i + 1]);
}
int ans = 0;
for (int i = 1; i <= n; i ++)
ans = max(
{ans,
a[i] + p2[i - 1] + s3[i + 1], a[i] + p3[i - 1] + s2[i + 1],
b[i] + p1[i - 1] + s3[i + 1], b[i] + p3[i - 1] + s1[i + 1],
c[i] + p1[i - 1] + s2[i + 1], c[i] + p2[i - 1] + s1[i + 1]
});
cout << ans << endl;
return ;
}
E1&&E2 Game with Marbles
分析
对\(a_i + b_i\)进行排序即可
如果此时Alice操作,那么收益为\(a_i - 1 + b_i\),如果是Bob操作,收益为\(b_i - 1 + a_i\),可以发现对于二者而言,判断选项的优劣的标准是一致的,因此按\(a_i + b_i\)排序即可
代码
点击查看代码
void solve () {
int n; cin >> n;
vector<int> a(n + 1, 0), b(n + 1, 0);
vector<PII> d(n + 1, {0, 0});
for (int i = 1; i <= n; i ++) cin >> a[i];
for (int i = 1; i <= n; i ++) cin >> b[i];
for (int i = 1; i <= n; i ++) d[i].fi = a[i] + b[i], d[i].sc = i;
sort(d.begin() + 1, d.end(), greater<PII>());
ll ans = 0;
for (int i = 1; i <= n; i ++) {
if (i & 1) {
ans += a[d[i].sc] - 1;
} else {
ans -= b[d[i].sc] - 1;
}
}
cout << ans << endl;
return ;
}

浙公网安备 33010602011771号