蓝桥杯 2020省赛 作物杂交

作物杂交

问题描述
在这里插入图片描述
 
输入格式
在这里插入图片描述
输出格式

输出一个整数,表示得到目标种子的最短杂交时间。

样例输入

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

样例说明
在这里插入图片描述

数据规模和约定
在这里插入图片描述

解析:本题用深度优先搜索,找出作物所需的最短杂交时间。

需用用到Vector 容器存储杂交方案,因为一种植物可能有多种杂交方法,需要找到最短的杂交时间。
Vector[i][j] 里面存储的是植物 i 在它的杂交方案的第j种的父母的 编号 x y
植物最短杂交时间求法(生成植物的最短时间)

  1. 植物已经有了,最短杂交时间为 0
  2. 植物 i 没有,需要杂交生成 最短杂交时间为 生成父母的时间 + 父母杂交生成植物 i 的时间
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <cstdio>
using namespace std;
int n, m, k, t;
//N作物种类总数 M初始拥有数量,K杂交的方案数,T目标种子
const int N = 2005;
struct parent{
	int x;
	int y;
};
vector< vector<parent> > hybrid(N);  //存储所有的杂交方案
int ti[N];   //存储种植时间 
int minT[N];  //存储作物的最短杂交时间  因为一种作物 可能有几种合成方法
bool have[N]; //表示作物是否拥有 或者 是否得知作物的最短杂交时间 
int f(int t)
{
	if (have[t]) //若是已有杂交出该种作物的最短时间
		return minT[t];//直接返回即可
	for(int i = 0; i < hybrid[t].size(); i ++)
	{
		parent tp = hybrid[t][i];  //能够杂交出当前作物的第i种方案
		//而每种方案的最短时间是
		int hyparent = max(ti[tp.x], ti[tp.y]);     //父母作物杂交所需时间 
		int plparent = max(f(tp.x), f(tp.y));           //种植父母所需时间
		int sum =  hyparent + plparent; 	//种植其‘父母’作物 time + 其父母作物杂交 Time
		minT[t] = min(minT[t], sum);       //取最小值 
	 } 
	 have[t] = 1; //表示该作物的最短杂交时间已经找到
	 return minT[t]; 
}
int main()
{
  // 请在此输入您的代码
  memset(minT, 0x3f, sizeof minT);
  //freopen("C:\\Users\\HK\\Desktop\\temp.txt","r",stdin);  //快速输入

 cin >> n >> m >> k >> t;
  for(int i = 1; i <= n; i ++) cin >> ti[i];
  for(int i = 1; i <= m; i ++) 
  { 
  		int x; cin >> x; have[x] = 1; minT[x] = 0;//最短杂交时间 = 0,因为不需要杂交
  }
  for(int i = 1; i <= k; i ++)
  {
	  parent tp; int v;
	  cin >> tp.x >> tp.y >> v;
	  hybrid[v].push_back(tp); //存储杂交方案 
  }
  cout << f(t); //递归求解
  return 0;
}

本题:作物杂交
代码参考:作者 Not Today!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值