Codeforces Round #572 (Div. 2)
作者:互联网
目录
Contest Info
Solved | A | B | C | D1 | D2 | E | F |
---|---|---|---|---|---|---|---|
6/7 | Ø | Ø | Ø | Ø | Ø | Ø | - |
- O 在比赛中通过
- Ø 赛后通过
- ! 尝试了但是失败了
- - 没有尝试
Solutions
A. Keanu Reeves
签到题。
#include <bits/stdc++.h>
using namespace std;
#define N 1100
char s[N]; int n;
int main() {
while (scanf("%d%s", &n, s + 1) != EOF) {
int cnt = 0;
for (int i = 1; i <= n; ++i) {
if (s[i] == '1') ++cnt;
else --cnt;
}
if (cnt) {
puts("1"); puts(s + 1);
} else {
puts("2");
printf("%c %s\n", s[1], s + 2);
}
}
return 0;
}
B. Number Circle
题意:
有一个序列\(a_1, a_2, \cdots, a_n\),要求重新排列构成一个环,任意一个数都要满足严格小于旁边两数之和。
输出方案;
思路:
本来的想法是最大的放中间,次大,第三大的放旁边这样一次放下去,但是发现这样并不总能构造出解。
后来想想,直接降序排,那么其中除了最大的一个元素可能不满足,其他元素肯定都满足。
那么我们先降序排,有\(a_n, a_{n - 1}, \cdots, a_1\)
然后将\(a_{n - 1}\)移到最后一个,依然满足其他元素都满足,最大的那个元素可能不满足。
但是这个情况下,如果最大的元素都不满足,那肯定满足不了了,因为和最大的元素相邻的是次大的和第三大的。
代码:
#include <bits/stdc++.h>
using namespace std;
#define N 100010
int n, a[N], b[N];
bool ok(int *a) {
if (a[2] + a[n] <= a[1]) return 0;
if (a[1] + a[n - 1] <= a[n]) return 0;
for (int i = 2; i < n; ++i) {
if (a[i - 1] + a[i + 1] <= a[i]) {
return 0;
}
}
return 1;
}
int main() {
while (scanf("%d", &n) != EOF) {
for (int i = 1; i <= n; ++i) scanf("%d", a + i);
sort(a + 1, a + 1 + n, [](int x, int y) {
return x > y;
});
b[1] = a[1];
for (int i = 3; i <= n; ++i) b[i - 1] = a[i];
b[n] = a[2];
if (ok(b)) {
puts("YES");
for (int i = 1; i <= n; ++i) printf("%d%c", b[i], " \n"[i == n]);
} else {
puts("NO");
}
}
return 0;
}
C. Candies!
题意:
有\(n\)个数\(s_i(0 \leq s_i \leq 9)\),定义
\[
\begin{eqnarray*}
f([a_1, a_2, \cdots, a_{2^k}]) = \sum\limits_{i = 1}^k \left \lfloor \frac{\sum\limits_{j = 1}^{i + 2^i - 1} a_j \bmod 10}{10} \right \rfloor \left \lfloor \frac{\sum\limits_{j = i + 2^i}^{} a_j \bmod 10}{10} \right \rfloor
\end{eqnarray*}
\]
D1. Add on a Tree
D2. Add on a Tree: Revolution
E. Count Pairs
标签:10,int,572,元素,Tree,Codeforces,满足,Add,Div 来源: https://www.cnblogs.com/Dup4/p/11144057.html