当前位置: 首页 > news >正文

蓝桥杯算法练习系统—作物杂交【第十一届】【省赛】【C组】

问题描述

作物杂交是作物栽培中重要的一步。已知有 N 种作物(编号 1 至 N ),第 i 种作物从播种到成熟的时间为 Ti。
作物之间两两可以进行杂交,杂交时间取两种中时间较长的一方。如作物 A 种植时间为 5 天,作物 B 种植时间为 7 天,则 AB 杂交花费的时间为 7 天。
作物杂交会产生固定的作物,新产生的作物仍然属于 N 种作物中的一种。

初始时,拥有其中 M 种作物的种子(数量无限,可以支持多次杂交)。同时可以进行多个杂交过程。
求问对于给定的目标种子,最少需要多少天能够得到。

如存在 4 种作物 ABCD,各自的成熟时间为 5 天、7 天、3 天、8 天。初始拥有 AB 两种作物的种子,目标种子为 D,已知杂交情况为 A×B→C,A×C→D。
则最短的杂交过程为:

第 1 天到第 7 天(作物 B 的时间),A×B→C。

第 8 天到第 12 天(作物 A 的时间),A×C→D。

花费 12 天得到作物 D 的种子。

输入格式

输入的第 1 行包含 4 个整数 N,M,K,T,N 表示作物种类总数(编号 1 至 N),M 表示初始拥有的作物种子类型数量,K 表示可以杂交的方案数,T 表示目标种子的编号。

第 2 行包含 N 个整数,其中第 i 个整数表示第 i 种作物的种植时间 Ti(1≤Ti≤100)。

第 3 行包含 M 个整数,分别表示已拥有的种子类型 Kj(1≤Kj≤M),Kj 两两不同。

第 4 至 K+3 行,每行包含 3 个整数 A,B,C,表示第 A 类作物和第 B 类作物杂交可以获得第 C 类作物的种子。

输出格式

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

思路:

我们改如何存储每种作物的所有杂交方案呢? 我开始想到是用二维数组存储,定义一个足够大的数组int hybrid[2005][2005],存储所有杂交方 案,如A + B->C,转换为hybrid[A][B] = C. 但是使用这种存储方案的的话,我想不到该如何去得到一种种子的最短杂交时间,因为目标种子 是数组所存的值,我们需要的是通过目标种子的标号能够得到能够杂交出该种子的所有杂交方 案! 所以这种方案肯定是不行的。

我又想出来一种通过二维向量(vector)来存储的办法。 定义一个二维向量vector< vector >hybrid(2005);存储每种作物的所有杂交方案 定义一个结构体存储杂交方案 struct parent //存储杂交方案 { int x; int y; };

每次输入一个能杂交出 x 作物的杂交方案(parent类型存储)就存入hybrid[x] 中。

#include<bits/stdc++.h> 
using namespace std; 
struct parent //存储杂交方案 
{     int x; int y; 
}; 
int n, m, k, t, tmp; 
long long plant_time[2005];//每种作物的种植时间 
bool flag[2005];//标记是否出现了该作物 
long long min_hybrid_time[2005];//杂交出每种作物的最短时间 
vector< vector<parent> >hybrid(2005);//存储每种作物的所有杂交方案 
long long solve(int now) 
{ if (flag[now])//若是已有杂交出该种作物的最短时间 return min_hybrid_time[now];//直接返回即可 for (int i = 0; i < hybrid[now].size(); i++)//对能够杂交出当前作物的方案都尝试一下 { parent tmp = hybrid[now][i];//能够杂交出当前作物的第i种方案 //当前作物的最短杂交时间是 杂交出该作物的所有方案 中的最短时间 //而每种方案的最短时间是种植其‘父母’作物所需要的时间 + 其父母作物杂交所需的的最短时
间(=两者杂交所需时间中的最大值) min_hybrid_time[now] = min(min_hybrid_time[now], max(plant_time[tmp.x], 
plant_time[tmp.y]) + max(solve(tmp.x), solve(tmp.y))); } flag[now] = true;//标记已经找到最短杂交时间 return min_hybrid_time[now];//返回最短杂交时间 
} 
int main() 
{ cin >> n >> m >> k >> t; memset(min_hybrid_time, 0x3f, sizeof(min_hybrid_time));//杂交出每种作物的最短时间初
始化为最大值memset(flag, false, sizeof(flag));//作物标记初始化 //注意作物的下标从1开始!!! for (int i = 1; i <= n; i++)//输入种植时间 cin >> plant_time[i]; for (int i = 0; i < m; i++)//输入初始种子数据 { cin >> tmp; flag[tmp] = true;//标记已经有了最短杂交时间 min_hybrid_time[tmp] = 0;//最短杂交时间 = 0,因为不需要杂交 } for (int i = 0; i < k; i++)//输入所有杂交方案 { parent temp; 
cin >> temp.x >> temp.y >> tmp; 
hybrid[tmp].push_back(temp);//存储杂交方案 
} 
solve(t);//递归求解 
cout << min_hybrid_time[t] << endl;//输出杂交出目标作物的最短时间 
return 0; 
}

http://www.lryc.cn/news/319577.html

相关文章:

  • java组合模式揭秘:如何构建可扩展的树形结构
  • pycharm 历史版本下载地址
  • Day39:安全开发-JavaEE应用SpringBoot框架Actuator监控泄漏Swagger自动化
  • VsCode免密登录
  • 蓝桥杯第八届A组:分巧克力
  • 前端框架的发展史介绍框架特点
  • 【MatLab】之:Simulink安装
  • 动手学习深度学习之环境配置
  • 【机器学习300问】35、什么是随机森林?
  • 用云服务器构建gpt和stable-diffusion大模型
  • 备考2024年小学生古诗文大会:历年真题15题练习和独家解析
  • C++之模板
  • Ubuntu Flask 运行 gunicorn+Nginx 部署
  • Tuxera NTFS 2023安装使用教程 Tuxera NTFS破解版 Tuxera NTFS for Mac优惠
  • Linux-centos如何搭建yum源仓库
  • Vue组件中引入jQuery
  • 设计模式 --3:装扮模式
  • element-plus中的表单校验
  • ros小问题之roslaunch tab补不全新增的功能包
  • C#常见的.Net类型(二)
  • oracle临时表空间不释放
  • Chapter 13 Techniques of Design-Oriented Analysis: The Feedback Theorem
  • 科研学习|论文解读——美国政治经济中的权力:网络分析(JASIST, 2019)
  • 常用的git命令
  • 【AI】用iOS的ML(机器学习)创建自己的AI App
  • 远程调用初体验笔记
  • 反无人机电子护栏:原理、算法及简单实现
  • Java项目利用Redisson实现真正生产可用高并发秒杀功能 支持分布式高并发秒杀
  • 0104行列式的性质-行列式-线性代数
  • k8s HPA 自动伸缩机制 (配置,资源限制,)