AT_ahc035_a.[AHC035A] Breed Improvement
NOI/NOI+/CTSC
通过率:0%
AC君温馨提醒
该题目为【atcoder】题库的题目,您提交的代码将被提交至atcoder进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。
题目描述
有一个用 N×N 格子表示的农田。农田最左上角的格子的坐标为 (0,0),从该格子向下移动 i 格、向右移动 j 格后的位置为 (i,j)。
给定 2N(N−1) 粒谷物种子。存在 M 个评价项目,每粒种子 k 都有一个表示各评价项目优劣的非负整数向量 xk=(xk,0, xk,1, ⋯, xk,M−1)(下称“评价项目向量”)。种子 k 的价值 Vk 定义为 Vk=∑l=0M−1xk,l。
通过以下操作重复 T 次,使手中种子的最大价值 max(V0, V1, ⋯, V2N(N−1)−1) 尽可能大。
-
在农田的 N2 个格子中,每个格子各种下一粒种子。同一粒种子不能种在多个格子,未被种下的 2N(N−1)−N2 粒种子全部丢弃。之后,对于上下左右相邻的格子中所种的种子对 (k, k′),会生成一粒新的种子,其评价项目向量的第 l 个元素值会从原种子的 xk,l 和 xk′,l 中等概率随机选取。这样共生成 2N(N−1) 粒新种子,作为新的手中种子。
新种子的生成示例
例如,当 M=3 时,将种子 0 种在格子 (0,0),种子 1 种在格子 (0,1)。若种子 0 的评价项目向量为 x0=(1,2,3),种子 1 的评价项目向量为 x1=(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,以及所有种子的评价项目向量 xk=(xk,0, xk,1, ⋯, xk,M−1),格式如下:
N M T
x0,0 ⋯ x0,M−1
⋮
x2N(N−1)−1,0 ⋯ x2N(N−1)−1,M−1
其中,输入满足以下约束:
- N=6
- M=15
- T=10
- 0≤xk,l≤100
- 所有输入均为整数
读取上述信息后,重复以下处理 T 轮:
每一轮,首先将每个格子种植的种子编号按如下格式输出到标准输出:
A0,0 ⋯ A0,N−1
⋮
AN−1,0 ⋯ AN−1,N−1
其中,Ai,j 表示种在格子 (i,j) 的种子编号,需满足 0≤Ai,j<2N(N−1),且同一轮内不能重复使用同一编号。
输出后,会从标准输入读入新生成的 2N(N−1) 粒种子的评价项目向量,格式如下:
x0,0 ⋯ x0,M−1
⋮
x2N(N−1)−1,0 ⋯ x2N(N−1)−1,M−1
其中,每个元素均为 0≤xk,l≤100 的整数。
每次输出后必须换行,并且刷新标准输出。 否则可能会导致 TLE。
解答程序可以在输出中包含以 # 开头的注释行。使用网页版可视化工具时,这些注释会在相应时机显示,便于调试和分析。评测程序会忽略所有注释行,因此可以直接提交包含注释的程序。
输出格式
见上文“输入格式”部分的说明。
说明/提示
故事背景
AtCoder 公司正在致力于谷物品种改良。谷物有美味、产量、抗病性等多个评价项目,社长高桥希望培育出在所有评价项目上都很优秀的谷物。
在格状农田中种植谷物种子后,相邻格子的两粒种子会随机继承各自的评价项目值,生成新的种子。通过多次种植和收获,希望你能培育出尽可能优秀的谷物种子。
得分
对于初始给定的 2N(N−1) 粒种子,评价项目向量第 l 项的最大值为 Xl=max(x0,l, x1,l, ⋯, x2N(N−1)−1,l)。经过 T 次操作后,手中种子的最大价值为 W=max(V0, V1, ⋯, V2N(N−1)−1),则得分为 round(106×W/∑l=0M−1Xl)。
共 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=V6=42+67+24+50+68=251,∑l=0M−1Xl=89+83+91+78+89=430,因此得分为 583721。
示例程序(Python)
以下为 Python 解答示例。该程序每次将第 0 到 35 号种子按左上到右下顺序依次种下。
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 号种子按左上到右下顺序依次种下。
#include <iostream>
#include <vector>
using namespace std;
int main() {
int N, M, T;
cin >> N >> M >> T;
int seed_count = 2 * N * (N - 1);
vector<vector<int>> X(seed_count, vector<int>(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<vector<int>> A(N, vector<int>(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 << A[i][j];
if (j < N - 1) {
cout << " ";
} else {
cout << endl;
}
}
}
cout.flush();
for (int i = 0; i < seed_count; i++) {
for (int j = 0; j < M; j++) {
cin >> X[i][j];
}
}
}
return 0;
}
输入生成方法
定义从标准正态分布生成值的函数为 randnormal()。
对于每个 k=0,1,⋯,2N(N−1),如下生成 xk=(xk,0, xk,1, ⋯, xk,M−1):
生成 M 维向量 (xk,0′,⋯,xk,M−1′),其中 xk,l′=∣randnormal()∣。令 pk=∑l=0M−1xk,l′2100,再令 xk,l=round(pkxk,l′)。
工具(输入生成器、本地测试器、可视化工具)
- 网页版:功能更强、可动画显示。
- 本地版:需安装 Rust 语言编译环境。
- Windows 版编译好的二进制文件:如不便配置 Rust 环境可使用此版本。
比赛期间,禁止分享可视化结果、解法及相关讨论,请注意。
工具所用输入文件格式说明
本地测试器使用如下格式的输入文件:
N M T
x0,0 ⋯ x0,M−1
⋮
x2N(N−1)−1,0 ⋯ x2N(N−1)−1,M−1
u0,0,0 ⋯ u0,0,N−2
⋮
u0,N−1,0 ⋯ u0,N−1,N−2
v0,0,0 ⋯ v0,0,N−1
⋮
v0,N−2,0 ⋯ v0,N−2,N−1
⋮
uT−1,0,0 ⋯ uT−1,0,N−2
⋮
uT−1,N−1,0 ⋯ uT−1,N−1,N−2
vT−1,0,0 ⋯ vT−1,0,N−1
⋮
vT−1,N−2,0 ⋯ vT−1,N−2,N−1
其中,ut,i,j 和 vt,i,j 是由 0、1 组成的 M 字符串,含义如下:
- 若 ut,i,j 的第 l 位为
0,则第 t 轮操作中,(i,j) 与 (i,j+1) 所种的种子 Ai,j 和 Ai,j+1 生成的新种子的第 l 项取 xAi,j,l;若为1,则取 xAi,j+1,l。 - 若 vt,i,j 的第 l 位为
0,则第 t 轮操作中,(i,j) 与 (i+1,j) 所种的种子 Ai,j 和 Ai+1,j 生成的新种子的第 l 项取 xAi,j,l;若为1,则取 xAi+1,j,l。
由 ChatGPT 4.1 翻译
输入解题思路,AI测评打分。不知道怎么写?