输入输出样例

示例

输入

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

暴力dfs就行了,我们要想好我们拥有的条件:

1.N个种子的种植时间

2.M个已有种子

3.K种杂交方案

4.求种出T的最短时间

怎么去dfs呢?

首先边界条件很好设置,如果在当前条件下已经种出来了,那么我们可以直接返回种出他要的时间,这里是period

然后,我们现在知道要种出什么,所以我们传入的参数应该有要种出的种子的编号,对这个编号,我们搜索所有能种出它的方案,对杂交得到他的两个种子继续进行判断,如果当前还没种出来,那就得继续种,直到找到一个种子编号c,另外两个种子a,b也早就已经存在或者种出来了,这个时候我们要更新一些结构,比如说当前种子已经拥有plant。

另外,我们要找出最小的种植时间,这是两个时间比较得到的:种植a,b的最大时间和种植得到a或b的最大时间,两个最大时间之和,以及当前period谁比较小,就得到了要时间量。所以period的初值设定要把已经存在的种子设置成0,因为已经有了,然后其余的初值要设置大一点,以便取min

#include <bits/stdc++.h>
using namespace std;
const int N=2001;
const int K=100001;
int w[N];//保存每个种子的种植时间
int cross[K][3];//保存方案
int period[N];//保存以当前M个种子出发,最短多久可以杂交出对应下标种子
bool plant[N];//是否种出或者说已经存在int dfs(int t,int k)
{if(plant[t]) return period[t];//避免重复求for(int i=1;i<=k;++i){if(cross[i][2]==t){int a=cross[i][0];int b=cross[i][1];if(!plant[a]) dfs(a,k);if(!plant[b]) dfs(b,k);if(plant[a]&&plant[b]){period[t]=min(period[t],max(w[a],w[b])+max(period[a],period[b]));}}}plant[t]=true;return period[t];
}int main()
{// 请在此输入您的代码int n,m,k,t,tmp;scanf("%d%d%d%d",&n,&m,&k,&t);memset(period,0x3f3f3f3f,sizeof(period));for(int i=1;i<=n;++i) scanf("%d",&w[i]);for(int i=1;i<=m;++i){scanf("%d",&tmp);plant[tmp]=true;period[tmp]=0;//已经有这颗种子了 直接得到不需要时间}for(int i=1;i<=k;++i){scanf("%d%d%d",&cross[i][0],&cross[i][1],&cross[i][2]);}cout<<dfs(t,k);return 0;
}

这里还有优化结构的空间,改善方案的存储方式:原来我们是按照方案数来存的,现在我们以杂交出的种子为下标,杂交的两个种子作为成分存储在一个vector中,这样在递归的时候可以不用遍历所有的方案数:

#include <bits/stdc++.h>
using namespace std;
const int N=2001;
const int K=100001;
typedef pair<int,int> PII;
vector<PII>cross[N];
int w[N];
// int cross[K][3];
int period[N];
bool plant[N];int dfs(int t)
{if(plant[t]) return period[t];for(int i=0;i<cross[t].size();++i){int a=cross[t][i].first;int b=cross[t][i].second;if(!plant[a]) dfs(a);if(!plant[b]) dfs(b);if(plant[a]&&plant[b]){period[t]=min(period[t],max(w[a],w[b])+max(period[a],period[b]));}}plant[t]=true;return period[t];
}int main()
{// 请在此输入您的代码int n,m,k,t,tmp;scanf("%d%d%d%d",&n,&m,&k,&t);memset(period,0x3f3f3f3f,sizeof(period));for(int i=1;i<=n;++i) scanf("%d",&w[i]);for(int i=1;i<=m;++i){scanf("%d",&tmp);plant[tmp]=true;period[tmp]=0;//已经有这颗种子了 直接得到不需要时间}for(int i=1;i<=k;++i){int a,b,c;scanf("%d%d%d",&a,&b,&c);cross[c].push_back({a,b});}cout<<dfs(t);return 0;
}

蓝桥杯真题:作物杂交相关推荐

  1. python解答蓝桥杯真题2 猜年龄 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在19351936年应邀来中国清华大学讲学。。。

    python解答蓝桥杯真题2 猜年龄 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学.他曾在1935~1936年应邀来中国清华大学讲学... 问题描述 全排列模板: 美国数学家维纳(N. ...

  2. 第五届蓝桥杯真题解析【JavaC组】

    第五届蓝桥杯真题解析[JavaC组] 业精于勤,荒于嬉:行成于思,毁于随.--韩愈 文章目录 ***第五届蓝桥杯真题解析[JavaC组]*** 前言 A:猜年龄 B:等额本金 C:猜字母 D:大衍数列 ...

  3. 【蓝桥杯真题】16天冲刺 Python

    距离比赛很快了,希望和我一起准备的PY党能更加熟练的掌握Python! 1.距离和(模拟赛填空题) 问题描述: 两个字母之间的距离定义为它们在字母表中位置的距离.例如 A和 C 的距离为 2,L 和  ...

  4. 蓝桥杯真题:三羊献瑞

    蓝桥杯真题:三羊献瑞 观查下面的加法算式: 其中相同的汉字代表相同的数字,不同的汉字代表不同的数字. 请你填写"三羊献瑞"所代表的4位数字(答案唯一),不要填写任何多余内容. 分析 ...

  5. # 2014年蓝桥杯真题CC++B组

    2014年蓝桥杯真题C/C++B组 1.啤酒和饮料 题目描述 啤酒每罐2.3元,饮料每罐1.9元,小明买了若干啤酒和饮料,一共花了82.3元. 我们还知道她买的啤酒比饮料的数量多,请你计算他买了几罐啤 ...

  6. 蓝桥杯python省赛冲刺篇2——常用算法的详细解析及对应蓝桥杯真题:打表模拟法、递推递归法、枚举法、贪心算法、差分与前缀和

    注意:加了题目链接 目录 注意:加了题目链接 一.打表模拟法 介绍 1. 算式问题 题目描述 解析与代码演示 2. 求值 题目描述 解析与代码演示 3. 既约分数 题目描述 解析与代码演示 4. 天干 ...

  7. 第十届蓝桥杯c语言试题,第十届蓝桥杯真题编程题1-7解析(高级组).pdf

    scratch 少儿编程第十届蓝桥杯真题 7 大家好 ~今天我们来讲解 scratch 蓝桥杯第十届编程大题的第七道题. 同样,这道题也是非常有难度的一道题.一起来看一下吧 解析: 女孩的程序 1.在 ...

  8. 第九届蓝桥杯真题解析JavaC组

    第九届蓝桥杯真题解析JavaC组 文章目录 ***第九届蓝桥杯真题解析JavaC组*** 前言 A.哪天回家 B.猴子分香蕉 C.字母阵列 D.第几个幸运数 E.书号验证 F.打印大X G.缩位求和 ...

  9. 蓝桥杯真题2017-2021

    刷完近几年真题,感觉理解完之后,拿奖问题不大,本人这次获得2022年蓝桥杯javaB组省一,以下是历年javaB组省赛题目. 文章目录 2017年真题 一.购物单 二.纸牌三角形 三.承压计算 四.魔 ...

  10. 蓝桥杯真题练习-棋盘放麦子

    蓝桥杯真题练习-棋盘放麦子 ## 填空题 2012 省赛 题目地址 题目概述 就是说有一个64个格子的棋盘,第一个格子放一粒麦子,第二个两粒,第三个四粒,第四个八粒,依次类推,最终需要多少麦子. 思路 ...

最新文章

  1. Error Correction and DeNovo Genome Assembly for the MinION Sequencing Reads mixing Illumina Short Re
  2. UIButton 未响应原因分析
  3. Python处理MLDonkey 下载中文文件乱码问题 (2)
  4. 哪些情况下索引会失效?
  5. 我如何预测10场英超联赛的确切结果
  6. 车险往年保单关联计算的性能优化
  7. JS模块化开发_思维导图
  8. 前端基础-html 介绍和head标签 ( 1 )
  9. 圆形插件html,jQuery简单实用的圆形进度条插件
  10. 帧动画和骨骼动画 本质的理解
  11. 加法的横式竖式教案c语言,竖式进位加法教案
  12. Excel调用已有数据利用已经录入的项快速的生成下拉列表
  13. 浅谈设计模式在iOS开发实战项目中的应用
  14. PlotJuggler绘图工具无法打开rosbag文件解决方案
  15. 如何判断网站使用的操作系统
  16. ChatGPT到底是赛博做题家还是科研颠覆者?
  17. Android第一节(体系介绍),维维复习
  18. Android微信分享图片按质量压缩的解决方案,androidndk开发教程
  19. 推荐一款简单高效在线APP原型工具
  20. UE4中蓝图实现小地图——雷达图篇

热门文章

  1. IOS查看包名、版本号、设备信息、签名、进程ID
  2. d盘莫名其妙被占空间 win10_为何联想电脑的win10系统d盘突然显示储存空间不足...
  3. Eclipse插件AngularJS Eclipse 1.2.0离线安装包
  4. 最新卡易搜卡盟系统全套/商户+主站+SUP+公告中心
  5. cmake的基本使用
  6. wifi: 连接网络时提示“已连接无法访问互联网”几秒钟后消失
  7. 【日常计算机问题记录】装系统时烧录的u盘如何恢复正常
  8. Java面试题——Java反射
  9. Linux 多线程编程(实现生产者消费者模型)
  10. 如何监控文件已成功通过EDI系统发给客户(一)-邮件通知