A - Table Tennis Training
略
B - Voting Judges
略
C - Domino Quality
当 N ≤ 3 N\leq 3 N≤3时特判。
经过一些尝试,可以在 N = 4 , 5 , 6 , 7 N=4,5,6,7 N=4,5,6,7时都构造出每行每列恰有 3 3 3个的方案,具体构造的方案可以看代码。注意到在 N N N的一个每行每列恰有 3 3 3个的方案右下方放一个 N = 4 N=4 N=4的方案,就可以得到一个 N + 4 N+4 N+4的每行每列恰有 3 3 3个的方案,于是可以对 N ≥ 4 N\geq 4 N≥4的所有 N N N构造出每行每列恰有 3 3 3个的方案。
时间复杂度 O ( N 2 ) \mathcal O(N^2) O(N2)。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const char* sol3[3]={
"aab","c.b","cdd"};
const char* sol4[4]={
"aacd","bbcd","efgg","efhh"};
const char* sol5[5]={
"aabbc","dee.c","d..fg","h..fg","hiijj"};
const char* sol6[6]={
"aabbc.","ddeec.",".f.g.h",".f.g.h","i.j.kk","i.j.ll"};
const char* sol7[7]={
"aa.bb.c",".dd..ec","f.gg.e.","f...h.i",".j..h.i","kj..ll.","k.mm.nn"};
char ans[1005][1005];
int main() {
int n;
scanf("%d",&n);
if (n<=2) {
puts("-1");
return 0;
}
if (n==3) {
for(int i=0;i<3;i++) puts(sol3[i]);
return 0;
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++) ans[i][j]='.';
int d=0;
while (n-d>=8) {
for(int i=0;i<4;i++)
for(int j=0;j<4;j++) ans[d+i][d+j]=sol4[i][j];
d+=4;
}
if (n-d==4) {
for(int i=0;i<4;i++)
for(int j=0;j<4;j++) ans[d+i][d+j]=sol4[i][j];
}
else if (n-d==5) {
for(int i=0;i<5;i++)
for(int j=0;j<5;j++) ans[d+i][d+j]=sol5[i][j];
}
else if (n-d==6) {
for(int i=0;i<6;i++)
for(int j=0;j<6;j++) ans[d+i][d+j]=sol6[i][j];
}
else {
for(int i=0;i<7;i++)
for(int j=0;j<7;j++) ans[d+i][d+j]=sol7[i][j];
}
for(int i=0;i<n;i++) puts(ans[i]);
return 0;
}
D - Problem Scores
显然只用考虑 K = ⌊ N − 1 2 ⌋ K=\lfloor \frac{N-1}{2}\rfloor K=⌊2N−1⌋即可。
假设 N N N是偶数(奇数类似),那么条件等价于 ∑ i = 1 K ( A N − K + i − A N − K − i ) < A 1 \sum_{i=1}^{K}(A_{N-K+i}-A_{N-K-i})< A_1 ∑i=1K(AN−K+i−AN−K−i)<A1。
考虑DP,设 F [ i ] [ j ] [ k ] F[i][j][k] F[i][j][k]表示考虑到 i i i,确定了 N − K − i N-K-i N−K−i到 N − K + i N-K+i N−K+i之间的相对顺序, A N − K + i − A N − K − i = j A_{N-K+i}-A_{N-K-i}=j AN−K+i−AN−K−i=j, ∑ l = 1 i ( A N − K + l − A N − K − l ) = k \sum_{l=1}^{i}(A_{N-K+l}-A_{N-K-l})=k ∑