Codeforces Round #776 (Div. 3) 题解
A - Deletions of Two Adjacent Letters
题意
给出一个字符串长度为奇数和一个字符。两个相邻字符可以删,问是否可以把这个字符串删成这个字符。
Solution
可以发现字符串中其他字符的总数是一个偶数,两个两个删一定是可以满足条件的。
但是可以发现一组 \(\texttt{Hack}\) 数据
abaaa
b
显然,最后只能删成这种情况
aba
于是要加一个判断,判断是否在这个字符之前的其他字符的个数是否是奇数,如果是就无解。
因为我是从 \(0\) 开始读入的,所以应该判断下标是否是偶数。
Code
/*
Writer: ZhengXiangYu
*/
#include <bits/stdc++.h>
using i64 = long long;
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
auto solve = [&]() -> void {
std::string s;
char c;
std::cin >> s >> c;
for (int i = 0; i < s.size(); i++) {
if (s[i] == c && (i % 2 == 0)) {
std::cout << "Yes" << std::endl;
return;
}
}
std::cout << "No" << std::endl;
return;
};
int T;
std::cin >> T;
while (T--) {
solve();
}
return 0;
}
B. DIV + MOD
题意
给出 \(l, r, a\), 求函数 \(f(x) = ⌊\frac{x}{a}⌋ + x \mod a(l\leq x \leq r)\) 的最值。
Solution
显然,可以把函数分成两部分来看。 对于第一部分要求 \(x\) 要尽可能的大, 而对于第二部分要求 \(x\) 尽量是 \(a - 1\)。
有点 \(CSP-J \ T1\) 的味道呢。
分成两种情况讨论,第一种情况是 \(r - l >= a\) ,根据鸽巢原理, \(x\) 一定可以是 \(a - 1\),
第二种情况则相反,最优的选择应该是 \(r\)。
/*
Writer: ZhengXiangYu
Time:
*/
#include <bits/stdc++.h>
using i64 = long long;
int main() {
// std::ios::sync_with_stdio(false);
// std::cin.tie(nullptr);
auto solve = [&]() -> void {
int a, l, r;
scanf("%d%d%d", &l, &r, &a);
int pos = 0;
if (l / a != r / a) {
for (int i = r; i >= l; i--) {
if (i % a != a - 1) {
i -= i % a;
}
if (i % a == a - 1) {
pos = i;
break;
}
}
} else {
pos = r;
}
std::cout << pos / a + pos % a << std::endl;
};
int T;
std::cin >> T;
while (T--) {
solve();
}
return 0;
}
C.Weight of the System of Nested Segments
题意
找 \(n \times 2\) 个点,时这些点构成的区间互相包含,比如有区间 \(a, b, c\),\(a\) 就要包含 \(b\), 而 \(b\) 则要包含 \(c\), 问选择点的权值最小值和这些嵌套的区间的左端点和右端点。
Solution
可以发现无论选择那些点,都一定可以构成包含的关系,连接 \(p,2\times n - p\) 总是满足条件的(\(1 \le p\le n \times 2\))。
显然是一个贪心了,贪心的选择权值更大的点,然后在像上面一样连接就可以了。
一共排两次序。
Code
/*
Writer: ZhengXiangYu
*/
#include <bits/stdc++.h>
using i64 = long long;
int main() {
auto solve = [&]() -> void {
int n, m;
scanf("%d%d", &n, &m);
struct node {
int x, w, id;
bool operator < (const node &a) const {
return w < a.w;
}
};
std::vector<node> a(m + 1);
for (int i = 1; i <= m; i++) {
scanf("%d%d", &a[i].x, &a[i].w);
a[i].id = i;
}
std::sort(a.begin() + 1, a.begin() + m + 1);
int ans = 0;
for (int i = 1; i <= n * 2; i++) {
ans += a[i].w;
}
auto cmp = [&](node a, node b) -> bool {
return a.x < b.x;
};
std::sort(a.begin() + 1, a.begin() + n * 2 + 1, cmp);
std::cout << ans << std::endl;
for (int i = 1; i <= n; i++) {
std::cout << a[i].id << " " << a[n * 2 - i + 1].id << std::endl;
}
std::cout << std::endl;
};
int T;
std::cin >> T;
while (T--) {
solve();
}
return 0;
}