第十一届蓝桥杯 ——作物杂交
Posted 业余算法学徒
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十一届蓝桥杯 ——作物杂交相关的知识,希望对你有一定的参考价值。
问题描述
作物杂交是作物栽培中重要的一步。
已知有 N N N 种作物 (编号 1 1 1 至 N N N ),第 i i i 种作物从播种到成熟的时间为 T i Ti Ti。
作物之间两两可以进行杂交,杂交时间取两种中时间较长的一方。
如作物 A A A 种植时间为 5 5 5 天,作物 B B B 种植时间为 7 7 7 天,则 A B AB AB 杂交花费的时间为 7 7 7 天。
作物杂交会产生固定的作物,新产生的作物仍然属于 N N N 种作物中的一种。
初始时,拥有其中 M M M 种作物的种子 (数量无限,可以支持多次杂交),同时可以进行多个杂交过程。
求问对于给定的目标种子,最少需要多少天能够得到。
如存在 4 4 4 种作物 A B C D ABCD ABCD,各自的成熟时间为 5 5 5 天、 7 7 7 天、 3 3 3 天、 8 8 8 天。
初始拥有 A B AB AB 两种作物的种子,目标种子为 D D D,已知杂交情况为 A × B → C , A × C → D A × B → C,A × C → D A×B→C,A×C→D。
则最短的杂交过程为:
- 第 1 1 1 天到第 7 7 7 天 (作物 B 的时间), A × B → C A × B → C A×B→C。
- 第 8 8 8 天到第 12 12 12 天 (作物 A 的时间), A × C → D A × C → D A×C→D。
- 花费 12 12 12 天得到作物 D D D 的种子。
输入描述
第
1
1
1 行包含
4
4
4 个整数
N
,
M
,
K
,
T
N, M, K, T
N,M,K,T,
N
N
N 表示作物种类总数 (编号
1
1
1 至
N
N
N),
M
M
M 表示初始拥有的作物种子类型数量,
K
K
K 表示可以杂交的方案数,
T
T
T 表示目标种子的编号。
第
2
2
2 行包含
N
N
N 个整数,其中第
i
i
i 个整数表示第
i
i
i 种作物的种植时间
T
i
Ti
Ti (
1
≤
T
≤
100
1≤T≤100
1≤T≤100)
第
3
3
3 行包含
M
M
M 个整数,分别表示已拥有的种子类型
K
j
Kj
Kj (
1
≤
K
j
≤
M
1 ≤ Kj ≤ M
1≤Kj≤M),
K
j
Kj
Kj 两两不同。
第
4
4
4 至
K
+
3
K+ 3
K+3 行,每行包含
3
3
3 个整数
A
,
B
,
C
A, B,C
A,B,C,表示第
A
A
A 类作物和第
B
B
B 类作物杂交可以获得第
C
C
C 类作物的种子。
输出描述
输出一个整数,表示得到目标种子的最短杂交时间。
样例输入
6 2 4 6
5 3 4 6 4 9
1 2
1 2 3
1 3 4
2 3 5
4 5 6
样例输出
16
样例说明
第
1
1
1 天至第
5
5
5 天,将编号
1
1
1 与编号
2
2
2 的作物杂交,得到编号
3
3
3 的作物种子。
第
6
6
6 天至第
10
10
10 天,将编号
1
1
1 与编号
3
3
3 的作物杂交,得到编号
4
4
4 的作物种子。
第
6
6
6 天至第
9
9
9 天,将编号
2
2
2 与编号
3
3
3 的作物杂交,得到编号
5
5
5 的作物种子。
第
11
11
11 天至第
16
16
16 天,将编号
4
4
4 与编号
5
5
5 的作物杂交,得到编号
6
6
6 的作物种子。
总共花费 16 16 16 天。
数据范围
对于所有评测用例,
1
≤
N
≤
2000
,
2
≤
M
≤
N
,
1
≤
K
≤
1
0
5
,
1
≤
T
≤
N
1 ≤ N≤ 2000, 2≤ M ≤ N, 1 ≤ K ≤10^5, 1 ≤ T ≤ N
1≤N≤2000,2≤M≤N,1≤K≤105,1≤T≤N,保证目标种子一定可以通过杂交得到。
题解
树形DP:
f[u]
:得到种子 u
的最短杂交时间。
#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
typedef pair<int, int> PII;
int N, M, K, T;
vector<PII> e[2010];
int Time[2010], Type[2010], f[2010];
void dfs(int u)
if(f[u] != -1) return;
f[u] = 0;
int minv = INF;
for (int i = 0; i < e[u].size(); i ++)
int a = e[u][i].first, b = e[u][i].second;
dfs(a), dfs(b);
minv = min(minv, max(f[a], f[b]) + max(Time[a], Time[b]));
if(minv != INF) f[u] += minv;
int main()
memset(f, -1, sizeof f);
cin >> N >> M >> K >> T;
for (int i = 1; i <= N; i ++) cin >> Time[i];
for (int i = 1; i <= M; i ++) cin >> Type[i];
while(K --)
int a, b, c;
cin >> a >> b >> c;
e[c].push_back(a, b);
dfs(T);
cout << f[T] << endl;
return 0;
以上是关于第十一届蓝桥杯 ——作物杂交的主要内容,如果未能解决你的问题,请参考以下文章