蓝桥杯真题:作物杂交
输入输出样例
示例
输入
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;
}
蓝桥杯真题:作物杂交相关推荐
- python解答蓝桥杯真题2 猜年龄 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在19351936年应邀来中国清华大学讲学。。。
python解答蓝桥杯真题2 猜年龄 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学.他曾在1935~1936年应邀来中国清华大学讲学... 问题描述 全排列模板: 美国数学家维纳(N. ...
- 第五届蓝桥杯真题解析【JavaC组】
第五届蓝桥杯真题解析[JavaC组] 业精于勤,荒于嬉:行成于思,毁于随.--韩愈 文章目录 ***第五届蓝桥杯真题解析[JavaC组]*** 前言 A:猜年龄 B:等额本金 C:猜字母 D:大衍数列 ...
- 【蓝桥杯真题】16天冲刺 Python
距离比赛很快了,希望和我一起准备的PY党能更加熟练的掌握Python! 1.距离和(模拟赛填空题) 问题描述: 两个字母之间的距离定义为它们在字母表中位置的距离.例如 A和 C 的距离为 2,L 和 ...
- 蓝桥杯真题:三羊献瑞
蓝桥杯真题:三羊献瑞 观查下面的加法算式: 其中相同的汉字代表相同的数字,不同的汉字代表不同的数字. 请你填写"三羊献瑞"所代表的4位数字(答案唯一),不要填写任何多余内容. 分析 ...
- # 2014年蓝桥杯真题CC++B组
2014年蓝桥杯真题C/C++B组 1.啤酒和饮料 题目描述 啤酒每罐2.3元,饮料每罐1.9元,小明买了若干啤酒和饮料,一共花了82.3元. 我们还知道她买的啤酒比饮料的数量多,请你计算他买了几罐啤 ...
- 蓝桥杯python省赛冲刺篇2——常用算法的详细解析及对应蓝桥杯真题:打表模拟法、递推递归法、枚举法、贪心算法、差分与前缀和
注意:加了题目链接 目录 注意:加了题目链接 一.打表模拟法 介绍 1. 算式问题 题目描述 解析与代码演示 2. 求值 题目描述 解析与代码演示 3. 既约分数 题目描述 解析与代码演示 4. 天干 ...
- 第十届蓝桥杯c语言试题,第十届蓝桥杯真题编程题1-7解析(高级组).pdf
scratch 少儿编程第十届蓝桥杯真题 7 大家好 ~今天我们来讲解 scratch 蓝桥杯第十届编程大题的第七道题. 同样,这道题也是非常有难度的一道题.一起来看一下吧 解析: 女孩的程序 1.在 ...
- 第九届蓝桥杯真题解析JavaC组
第九届蓝桥杯真题解析JavaC组 文章目录 ***第九届蓝桥杯真题解析JavaC组*** 前言 A.哪天回家 B.猴子分香蕉 C.字母阵列 D.第几个幸运数 E.书号验证 F.打印大X G.缩位求和 ...
- 蓝桥杯真题2017-2021
刷完近几年真题,感觉理解完之后,拿奖问题不大,本人这次获得2022年蓝桥杯javaB组省一,以下是历年javaB组省赛题目. 文章目录 2017年真题 一.购物单 二.纸牌三角形 三.承压计算 四.魔 ...
- 蓝桥杯真题练习-棋盘放麦子
蓝桥杯真题练习-棋盘放麦子 ## 填空题 2012 省赛 题目地址 题目概述 就是说有一个64个格子的棋盘,第一个格子放一粒麦子,第二个两粒,第三个四粒,第四个八粒,依次类推,最终需要多少麦子. 思路 ...
最新文章
- Error Correction and DeNovo Genome Assembly for the MinION Sequencing Reads mixing Illumina Short Re
- UIButton 未响应原因分析
- Python处理MLDonkey 下载中文文件乱码问题 (2)
- 哪些情况下索引会失效?
- 我如何预测10场英超联赛的确切结果
- 车险往年保单关联计算的性能优化
- JS模块化开发_思维导图
- 前端基础-html 介绍和head标签 ( 1 )
- 圆形插件html,jQuery简单实用的圆形进度条插件
- 帧动画和骨骼动画 本质的理解
- 加法的横式竖式教案c语言,竖式进位加法教案
- Excel调用已有数据利用已经录入的项快速的生成下拉列表
- 浅谈设计模式在iOS开发实战项目中的应用
- PlotJuggler绘图工具无法打开rosbag文件解决方案
- 如何判断网站使用的操作系统
- ChatGPT到底是赛博做题家还是科研颠覆者?
- Android第一节(体系介绍),维维复习
- Android微信分享图片按质量压缩的解决方案,androidndk开发教程
- 推荐一款简单高效在线APP原型工具
- UE4中蓝图实现小地图——雷达图篇
热门文章
- IOS查看包名、版本号、设备信息、签名、进程ID
- d盘莫名其妙被占空间 win10_为何联想电脑的win10系统d盘突然显示储存空间不足...
- Eclipse插件AngularJS Eclipse 1.2.0离线安装包
- 最新卡易搜卡盟系统全套/商户+主站+SUP+公告中心
- cmake的基本使用
- wifi: 连接网络时提示“已连接无法访问互联网”几秒钟后消失
- 【日常计算机问题记录】装系统时烧录的u盘如何恢复正常
- Java面试题——Java反射
- Linux 多线程编程(实现生产者消费者模型)
- 如何监控文件已成功通过EDI系统发给客户(一)-邮件通知