CSP 前和 grass8woc 和 black_trees 一起 VP 了一场 ARC,进行了一个思路的打开。
发现远古场的 ARC 竟然是和 ABC 一起开始的,就跟 Div.1 + Div.2 差不多。
第一次做出来 ARC 的前三题耶!虽然是远古场。应该是和 grass8woc 一起打如有神助哈哈哈。
不得不说确实比板子有意思,练了一堆板子结果考场一个没考。
C. 4-adjacent
显然 \(2\) 以外的因子都没用,而且大于 \(2\) 的指数也没用,所以直接转化成只有 \(1, 2, 4\)。
然后如果没有 \(2\) 那显然就是 \(1, 4, 1, 4, \cdots , 1, 4, 1\) 这样子。如果有 \(2\) 那么肯定是把 \(2\) 放在一堆(因为他们不能和 \(1\) 放在一起,所以尽量不要浪费 \(4\)),即形如 \(1, 4, 1, 4, \cdots 1, 4, 2, 2, \cdots 2\)。
所以结论就是
puts((cnt[2] ? (cnt[1] <= cnt[4] + 1) : (cnt[1] <= cnt[4])) ? "Yes" : "No");
代码
#include <cstdio>
#include <algorithm>
const int N = 1e5 + 5;
int n;
int a[N];
int main() {
scanf("%d", &n);
int cnt1 = 0, cnt2 = 0, cnt4 = 0;
for(int i = 1; i <= n; i++) {
int x;
scanf("%d", &x);
if(x % 4 == 0) cnt4++;
else if(x % 2 == 0) cnt2++;
else cnt1++;
}
puts((cnt1 > cnt4 && cnt2) || (cnt1 > cnt4 + 1) ? "No" : "Yes");
return 0;
}
D. Grid Coloring
考虑一个颜色一个颜色地放,显然这样干的前提我们需要找到一个铺满网格的四连通路径。显然这是可以的。然后就做完了。
代码
#include <cstdio>
#include <algorithm>
const int N = 100 + 5;
int n, m, K;
int a[N * N];
int b[N][N];
int main() {
scanf("%d%d%d", &n, &m, &K);
for(int i = 1; i <= K; i++) scanf("%d", &a[i]);
int x = 1, y = 1, c = 1;
while(x <= n) {
while(c <= K && a[c] == 0) c++;
a[c]--, b[x][y] = c;
y += (x & 1) ? 1 : -1;
if(y < 1) x++, y = 1;
if(y > m) x++, y = m;
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) printf("%d ", b[i][j]);
puts("");
}
return 0;
}