2021年团体程序设计天梯赛题解
太菜了,拖后腿的感觉是真的难受。然后,你们可以三连一下文章,安慰一下吗?
知道用回溯来求解,但是不知道怎么模拟。就拿了1分,真的难。
L2-2 病毒溯源 (25 分)
病毒容易发生变异。某种病毒可以通过突变产生若干变异的毒株,而这些变异的病毒又可能被诱发突变产生第二代变异,如此继续不断变化。
现给定一些病毒之间的变异关系,要求你找出其中最长的一条变异链。
在此假设给出的变异都是由突变引起的,不考虑复杂的基因重组变异问题 —— 即每一种病毒都是由唯一的一种病毒突变而来,并且不存在循环变异的情况。
输入格式:
输入在第一行中给出一个正整数 N(≤10^4),即病毒种类的总数。于是我们将所有病毒从 0 到 N−1 进行编号。
随后 N 行,每行按以下格式描述一种病毒的变异情况:
k 变异株1 …… 变异株k
其中 k
是该病毒产生的变异毒株的种类数,后面跟着每种变异株的编号。第 i 行对应编号为 i 的病毒(0≤i<N)。题目保证病毒源头有且仅有一个。
输出格式:
首先输出从源头开始最长变异链的长度。
在第二行中输出从源头开始最长的一条变异链,编号间以 1 个空格分隔,行首尾不得有多余空格。如果最长链不唯一,则输出最小序列。
输入样例:
10
3 6 4 8
0
0
0
2 5 9
0
1 7
1 2
0
2 3 1
输出样例:
4
0 4 9 1
题目思路(*):
- 由某种病毒可以通过突变产生若干变异的毒株,所以我们需要先找到根,没有出现在变异株的那个节点,就是跟
for(int i = 0;i<n;i++){if(pre[i]==0){parent=i;break;}}
- 因为题目中谈到不存在循环变异,所以结果只能是一条长链
- 结果需要输出从源头开始最长的一条变异链。使用回溯去暴力解答
- 如果最长链不唯一,则输出最小序列。对输入的变异株1 …… 变异株k进行从小到大的排序,这样如果能找到最大路径的话一定是最小序列
sort(child[i].begin(),child[i].end());
- 分析一下关键的dfs回溯
- one:病毒序号,当前病毒所在链的位置
- 初始:传入根,根是第一个位置,所以是dfs(root,1)
- 函数中先进行最大长度判断更新,后来开始循环后继节点
- 在后继节点中,进行回溯
void dfs(int one,int step){if(step>maxx){maxx=step;ans=temp;}for(int i = 0;i<child[one].size();i++){temp.push_back(child[one][i]);dfs(child[one][i],step+1);temp.pop_back();//除去vector中最后一个 }return ;
}
题解代码:
代码中//*
表示代码关键的地方
#include<bits/stdc++.h>
using namespace std;
vector<int> child[10005];
vector<int> ans,temp;
int pre[10005];
int maxx;
void dfs(int one,int step){if(step>maxx){maxx=step;ans=temp;}for(int i = 0;i<child[one].size();i++){temp.push_back(child[one][i]);//*dfs(child[one][i],step+1);//*temp.pop_back();//*}return ;
}int main()
{int n;scanf("%d",&n);int k,x;for(int i = 0;i<n;i++){scanf("%d",&k);while(k--){scanf("%d",&x);pre[x]=1;child[i].push_back(x);}sort(child[i].begin(),child[i].end());//*}int root;//*for(int i = 0;i<n;i++){if(pre[i]==0){root=i;break;}} dfs(root,1);printf("%d\n",maxx);printf("%d",root);for(int i= 0;i<ans.size();i++){printf(" %d",ans[i]); } return 0;
}
2021年团体程序设计天梯赛题解相关推荐
- 2021年团体程序设计天梯赛-总决赛L2题解
2021年团体程序设计天梯赛-总决赛! L2-1 包装机 思路:模拟 代码: #include<bits/stdc++.h> using namespace std; int main() ...
- 2021年团体程序设计天梯赛-总决赛题解
L2-2 病毒溯源 L2-4 哲哲打游戏 L3-2 还原文件 L1-1 人与神 (5 分) 跨界大神 L. Peter Deutsch 有一句名言:"To iterate is human, ...
- 2021团体程序设计天梯赛题解
先贴成绩 今年L1的题偏基础,比赛用了一个小时切完了,(算上PTA系统网络错误崩了20分钟和BW傻等-QAQ)L2顺着做的,L2-1模拟过了去看L2-2,并查集写完数据跑错了,调了一个小时发现题目说明 ...
- 2020团体程序设计天梯赛题解(部分)
文章目录 个人题解:这里我只写我个人认为应该写的题解,太简单的就不写了 L2-2 口罩发放 (25分) 思路:正解 L2-3 完全二叉树的层序遍历 (25分) 思路:正解 L2-4 网红点打卡攻略 ( ...
- 2021年团体程序设计天梯赛-模拟赛
文章目录 L1-1 宇宙无敌大招呼 (5 分) 输入格式: 输出格式: 输入样例: 输出样例: Code L1-2 考试周 (5 分) 输入格式: 输出格式: 输入样例: 输出样例: Code L1- ...
- 2021年团体程序设计天梯赛-总决赛 L3-2 还原文件
一份重要文件被撕成两半,其中一半还被送进了碎纸机.我们将碎纸机里找到的纸条进行编号,如图 1 所示.然后根据断口的折线形状跟没有切碎的半张纸进行匹配,最后还原成图 2 的样子.要求你输出还原后纸条的正 ...
- 2022团体程序设计天梯赛题解 L2
题目 感觉今年L2有点难,难在题目描述,题目描述的云里雾里的比题目本身难得多.2-3我确实没想出来,确实菜,不过想出来也拿不了国二,太菜啦,抓紧remake叭. L2-1 题意: 题意很烦.给定一个栈 ...
- GPLT团体程序设计天梯赛题解L1部分
文章目录 00x L1-001 Hello World (5 分) L1-002 打印沙漏 (20 分) L1-003 个位数统计 (15 分) L1-004 计算摄氏温度 (5 分) L1-005 ...
- 2023年团体程序设计天梯赛
2020年团体程序设计天梯赛 PTA L2-034 口罩发放 (25 分) PTA L2-036 网红点打卡攻略 (25 分) 2021年团体程序设计天梯赛 PTA L1-078 吉老师的回归 (15 ...
- PTA|团体程序设计天梯赛-练习题库集
文章目录 关于爬取脚本的编写 L1-001 Hello World! (5 分) L1-002 打印沙漏 (15 分) L1-003 个位数统计 (15 分) L1-004 计算摄氏温度 (5 分) ...
最新文章
- HTML5的 input:file上传类型控制
- FJ集团企业级邮件服务器构建方案
- 火星云分发全网视频_火星云矿总裁商思林:三大引擎点燃2020年超级牛市,挖矿和理财将成为资产配置必选项...
- 使用域超级管理员打开Exchange 2010发现没有权限
- Java--Socket通信
- 应用回归分析第五版电子书_应用回归分析课后习题参考答案 全部版 何晓群,刘文卿...
- 浴血凤凰DNF自动辅助开发教程
- 台式计算机常用总线,计算机中常见的总线有哪些
- 菜鸟又出手!家里没人也能收包裹,这个黑科技还获过阿里内部大奖
- 基于matlab的微分例题,matlab程序设计常微分方程编程例题答案数学.doc
- python 图标题上移_请问如何在这个Python中将标题一起爬下来啊
- 英文论文评审意见_英文论文审稿意见汇总
- Lum Proxy全球代理IP,真实家庭住宅网络!
- FMI飞马网【线上直播】京东POP接口自动化测试
- MacBook使用HHKB键盘设置
- Java 核心技术卷 II(第 8 版) – 读书笔记 – 第 1 章(下)
- 自己做一个table插件 (一)Ajax获取数据后动态生成table
- 数据库原理课后答案 第二章
- 工控机与商用计算机的区别,两招教你分辨工控机与普通电脑的区别
- 快速开发混凝土搅拌企业管理平台