AT_ahc035_a [AHC035A] Breed Improvement
题目描述
有一个用 $N\times N$ 格子表示的农田。农田最左上角的格子的坐标为 $(0,0)$,从该格子向下移动 $i$ 格、向右移动 $j$ 格后的位置为 $(i,j)$。
给定 $2N(N-1)$ 粒谷物种子。存在 $M$ 个评价项目,每粒种子 $k$ 都有一个表示各评价项目优劣的非负整数向量 $\boldsymbol{x_k}=(x_{k,0},\ x_{k,1},\ \cdots,\ x_{k,M-1})$(下称“评价项目向量”)。种子 $k$ 的价值 $V_k$ 定义为 $V_k=\sum_{l=0}^{M-1}x_{k,l}$。
通过以下操作重复 $T$ 次,使手中种子的最大价值 $\max(V_0,\ V_1,\ \cdots,\ V_{2N(N-1)-1})$ 尽可能大。
- 在农田的 $N^2$ 个格子中,每个格子各种下一粒种子。同一粒种子不能种在多个格子,未被种下的 $2N(N-1)-N^2$ 粒种子全部丢弃。之后,对于上下左右相邻的格子中所种的种子对 $(k,\ k')$,会生成一粒新的种子,其评价项目向量的第 $l$ 个元素值会从原种子的 $x_{k,l}$ 和 $x_{k',l}$ 中等概率随机选取。这样共生成 $2N(N-1)$ 粒新种子,作为新的手中种子。
新种子的生成示例
例如,当 $M=3$ 时,将种子 $0$ 种在格子 $(0,0)$,种子 $1$ 种在格子 $(0,1)$。若种子 $0$ 的评价项目向量为 $\boldsymbol{x_0}=(1,2,3)$,种子 $1$ 的评价项目向量为 $\boldsymbol{x_1}=(4,5,6)$,则新种子的评价项目向量可能为以下 $8$ 种之一:
- $(1,2,3)$
- $(1,2,6)$
- $(1,5,3)$
- $(1,5,6)$
- $(4,2,3)$
- $(4,2,6)$
- $(4,5,3)$
- $(4,5,6)$
从这 $8$ 个评价项目向量中等概率随机选取 $1$ 个,作为新种子的评价项目向量。
输入格式
**※本题为交互式题目。请阅读以下内容,并与评测程序进行交互。**
首先,从标准输入读入农田大小 $N$、评价项目数 $M$、操作次数 $T$,以及所有种子的评价项目向量 $\boldsymbol{x_k}=(x_{k,0},\ x_{k,1},\ \cdots,\ x_{k,M-1})$,格式如下:
> $N$ $M$ $T$
> $x_{0,0}$ $\cdots$ $x_{0,M-1}$
> $\vdots$
> $x_{2N(N-1)-1,0}$ $\cdots$ $x_{2N(N-1)-1,M-1}$
其中,输入满足以下约束:
- $N=6$
- $M=15$
- $T=10$
- $0\le x_{k,l}\le 100$
- 所有输入均为整数
读取上述信息后,重复以下处理 $T$ 轮:
每一轮,首先将每个格子种植的种子编号按如下格式输出到标准输出:
> $A_{0,0}$ $\cdots$ $A_{0,N-1}$
> $\vdots$
> $A_{N-1,0}$ $\cdots$ $A_{N-1,N-1}$
其中,$A_{i,j}$ 表示种在格子 $(i,j)$ 的种子编号,需满足 $0\le A_{i,j} $x_{0,0}$ $\cdots$ $x_{0,M-1}$
> $\vdots$
> $x_{2N(N-1)-1,0}$ $\cdots$ $x_{2N(N-1)-1,M-1}$
其中,每个元素均为 $0\le x_{k,l}\le 100$ 的整数。
**每次输出后必须换行,并且刷新标准输出。** 否则可能会导致 TLE。
解答程序可以在输出中包含以 `#` 开头的注释行。使用网页版可视化工具时,这些注释会在相应时机显示,便于调试和分析。评测程序会忽略所有注释行,因此可以直接提交包含注释的程序。
输出格式
见上文“输入格式”部分的说明。
说明/提示
### 故事背景
AtCoder 公司正在致力于谷物品种改良。谷物有美味、产量、抗病性等多个评价项目,社长高桥希望培育出在所有评价项目上都很优秀的谷物。
在格状农田中种植谷物种子后,相邻格子的两粒种子会随机继承各自的评价项目值,生成新的种子。通过多次种植和收获,希望你能培育出尽可能优秀的谷物种子。
### 得分
对于初始给定的 $2N(N-1)$ 粒种子,评价项目向量第 $l$ 项的最大值为 $X_l=\max(x_{0,l},\ x_{1,l},\ \cdots,\ x_{2N(N-1)-1,l})$。经过 $T$ 次操作后,手中种子的最大价值为 $W=\max(V_0,\ V_1,\ \cdots,\ V_{2N(N-1)-1})$,则得分为 $\mathrm{round}(10^6\times W/\sum_{l=0}^{M-1}{X_l})$。
共 300 个测试用例,所有测试用例得分之和为提交的总得分。若有任一测试用例输出非法或超时,则整体判定为 WA 或 TLE。比赛期间以最高得分计入最终排名,赛后不再进行系统测试。得分相同者排名并列。
### 输入输出示例
以下为不满足实际约束的说明用输入示例。
回合 Output Input 事前信息 ```
3 5 10
42 45 29 50 53
19 35 91 0 11
35 83 30 9 31
28 18 20 28 88
0 52 21 66 51
24 9 35 10 89
57 27 13 73 24
22 2 5 78 59
66 67 27 18 12
81 38 24 21 32
89 21 32 16 19
6 27 9 67 68
```
0 ```
5 4 7
8 9 0
11 2 6
```
```
0 52 21 10 89
0 52 21 78 59
66 67 24 18 32
81 38 24 50 32
6 27 30 67 31
57 27 13 73 24
24 9 27 10 12
81 52 24 21 51
42 45 5 50 53
66 27 27 67 68
35 83 30 9 31
42 27 13 73 53
```
1 ```
6 8 11
3 9 1
7 2 5
```
```
42 45 5 10 12
42 45 13 73 53
66 38 24 50 32
66 52 27 67 68
81 52 24 18 32
66 67 13 18 32
81 38 27 10 12
42 27 5 50 68
0 52 13 78 53
81 52 24 50 32
66 67 27 67 32
0 52 13 78 59
```
$ \vdots $ 9 ```
2 6 10
8 1 9
11 4 3
```
```
42 27 5 50 68
42 27 5 50 32
0 67 27 50 68
42 27 5 50 68
42 27 24 50 32
42 67 5 50 68
42 67 24 50 68
42 27 27 50 68
0 27 5 50 32
0 67 24 50 68
42 67 5 50 68
42 27 5 50 32
```
在此例中,$W=V_6=42+67+24+50+68=251$,$\sum_{l=0}^{M-1}{X_l}=89+83+91+78+89=430$,因此得分为 $583721$。
[查看示例](https://img.atcoder.jp/ahc035/F5dI2O6U.html?lang=ja&seed=0&output=sample)
### 示例程序(Python)
以下为 Python 解答示例。该程序每次将第 $0$ 到 $35$ 号种子按左上到右下顺序依次种下。
```python
N, M, T = map(int, input().split())
SEED_COUNT = 2 * N * (N - 1)
X = []
for i in range(SEED_COUNT):
X.append(list(map(int, input().split())))
for t in range(T):
A = [[0] * N for i in range(N)]
for i in range(N):
for j in range(N):
A[i][j] = i * N + j
for i in range(N):
print(' '.join(map(str, A[i])), flush=True)
X = []
for i in range(SEED_COUNT):
X.append(list(map(int, input().split())))
```
### 示例程序(C++)
以下为 C++ 解答示例。该程序每次将第 $0$ 到 $35$ 号种子按左上到右下顺序依次种下。
```cpp
#include
#include
using namespace std;
int main() {
int N, M, T;
cin >> N >> M >> T;
int seed_count = 2 * N * (N - 1);
vector X(seed_count, vector(M, 0));
for (int i = 0; i < seed_count; i++) {
for (int j = 0; j < M; j++) {
cin >> X[i][j];
}
}
for (int t = 0; t < T; t++) {
vector A(N, vector(N, 0));
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
A[i][j] = i * N + j;
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cout