备战蓝桥杯---DFS基础刷题

话不多说,直接看题:

1.注意搜索顺序+枚举方式

首先,看到数据范围,我们就不可以直接每一轮3次的暴力。

我们可以发现a^2的大部分情况>2a以及a+1,并且,我们发现其实1的操作是没有必要的(因为2a以经包括了),因此,我们可以把枚举过程想象成只进行2/3操作,只有实在不行时才选1,注意,如果直接正着做会比较麻烦,如这组数据:

正着做的话存在一个问题那就是我们不知道何时+1,因为+1后可能使后面更优,于是我们考虑反着看就可以发现反着符合刚才说的:

我们考虑最后变成b的前一步,我们发现有只有两种情况,就是*2加上剩下的用加1的操作以及平方加上剩下的用加1的操作(或者就是b-a(当两种都会超b))。

同时加上记忆化搜索即可。

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int t;
long long a,b;
map<long long,long long> mp;
long long dfs(long long b){
    if(b==a) return 0;
    if(mp.count(b)!=0) return mp[b];
    mp[b]=abs(b-a);
    long long cc=sqrt(b);
    if(cc>=a) mp[b]=min(dfs(cc)+1+b-cc*cc,mp[b]);
    if(b/2>=a) mp[b]=min(dfs(b/2)+1+b%2,mp[b]);
    return mp[b];
    
}
int main(){
    cin>>t;
    while(t--){
        mp.clear();
        scanf("%lld%lld",&a,&b);
        cout<<dfs(b)<<endl;
    }
}

2.树的遍历:

首先我们可以给每一个节点赋值(即第一行1,第二行2,3.。。。)

同时因为数字是从右往左输出,我们可以调整一下中序以及前序的左右遍历顺序,然后我们按照节点值从小到大输出即可。

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,mid[40],pre[40],cnt;
struct node{
    int id,zhi;
}v[1000];
void dfs(int root,int l,int r,int ii){
    if(l>r) return;
    int m=l;
    while(pre[root]!=mid[m]&&m<r) m++;
    v[++cnt]={ii,mid[m]};
    dfs(root+1+m-l,m+1,r,2*ii);
    dfs(root+1,l,m-1,2*ii+1);
}
bool cmp(node a,node b){
    return a.id<b.id;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++) cin>>mid[i];
    for(int i=1;i<=n;i++) cin>>pre[i];
    dfs(1,1,n,1);
    sort(v+1,v+cnt+1,cmp);
    for(int i=1;i<=cnt;i++){
        cout<<v[i].zhi<<" ";
    }
    cout<<endl;
}

3.图的DFS:

我们可以把问题抽象成求最小的环,首先我们把不是环的枝叶去掉,然后因为一个点只有一条出边,我们没有必要用存图的方式来记录,我们开个nxt数组即可,最后进行DFS即可。

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,nxt[200010],inc[200010],vis[200010];
void del(int hh){
	vis[hh]=1;
	inc[nxt[hh]]--;
	if(inc[nxt[hh]]==0) del(nxt[hh]);
}
int deal(int hh){
	if(vis[hh]!=0) return 0;
	vis[hh]=1;
	return deal(nxt[hh])+1;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		scanf("%d",&nxt[i]);
		inc[nxt[i]]++;
	}
	for(int i=1;i<=n;i++){
		if(vis[i]==1) continue;
		if(inc[i]==0) del(i);
	}
	int ans=100000000;
	for(int i=1;i<=n;i++){
		if(vis[i]==1) continue;
		ans=min(ans,deal(i));
	}
	cout<<ans;
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/412042.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring-Cloud-Gateway集成Sentinel限流

1&#xff09;gateway添加sentinel相关依赖 <spring-cloud.version>2021.0.1</spring-cloud.version> <spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version><dependencies><!--gateway--><dependency><gro…

【c语言】if 选择语句

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

Python爬虫实战:从API获取数据

引言 在现代软件开发中&#xff0c;API已经成为获取数据的主要方式之一。API允许不同的软件应用程序相互通信&#xff0c;共享数据和功能。在本文中&#xff0c;我们将学习如何使用Python从API获取数据&#xff0c;并探讨其在实际应用中的价值。 目录 引言 二、API基础知识 …

数据湖delta lake

Table of Content1. 课程2. 前置技能3. 一、数据湖概念[了解] 3.1. 1.1 企业的数据困扰 3.1.1. 困扰一&#xff1a;互联网的兴起和数据孤岛3.1.2. 困扰二&#xff1a;非结构化数据3.1.3. 困扰三&#xff1a;保留原始数据3.1.4. 补充&#xff1a;什么是结构化&#xff1f; 3.1.4…

【Git教程】(三)提交详解 —— add、commit、status、stach命令的说明,提交散列值与历史,多次提交及忽略 ~

Git教程 提交详解 1️⃣ 访问权限与时间戳2️⃣ add命令与 commit 命令3️⃣ 提交散列值4️⃣ 提交历史5️⃣ 一种特别的提交查看方法6️⃣ 同一项目的多部不同历史6.1 部分输出&#xff1a;-n6.2 格式化输出&#xff1a;--format、--oneline6.3 统计修改信息&#xff1a;--st…

rtthread stm32h743的使用(一)新工程建立

我们要在rtthread studio 开发环境中建立stm32h743xih6芯片的工程。我们使用一块stm32h743及fpga的核心板完成相关实验&#xff0c;核心板如图&#xff1a; 1.打开rtthread studio填写芯片型号及调试口&#xff0c;我们的调试串口为USART1_PA9,PA10。 2.编译新工程并且下载 …

pycharm如何安装pygame库

pycharm如何安装pygame库 PyCharm是Python中广受欢迎的一种IDE&#xff0c;它可以为用户提供许多工具和便利的服务&#xff0c;从而大大提高开发效率。pygame库可以用python进行游戏开发提供很好的支持&#xff0c;那么在ptcharm中如何安装pygame库呢&#xff1f; 一、安装步…

Oracle内存计算应用模式

前言 内存计算是利用内存来加速数据访问和应用的性能&#xff0c;并降低应用开发复杂度的技术。近十年来&#xff0c;随着软硬件技术的发展和用户需求的成熟&#xff0c;内存计算技术已经得到了广泛地应用。 Oracle在内存计算领域具有非常重要的地位&#xff0c;这主要得益于…

ElasticSearch之操作管理规范【附件可下载world文档】

一、 目的 为了在软件生命周期内规范数据库相关的设计、开发、运维工作,便于不同团队之间的沟通及协调,制定此文档,以期在相关规范上达成共识和默契,提升相关环节的工作效率及系统的可维护性。同时好的规范,在执行的时候可以培养出好的习惯,好的习惯是软件质量的很好保证…

跟着cherno手搓游戏引擎【26】Profile和Profile网页可视化

封装Profile&#xff1a; Sandbox2D.h:ProfileResult结构体和ProfileResult容器&#xff0c;存储相应的信息 #pragma once #include "YOTO.h" class Sandbox2D :public YOTO::Layer {public:Sandbox2D();virtual ~Sandbox2D() default;virtual void OnAttach()ove…

Docker Volume

"Ice in my vein" Docker Volume(存储卷) 什么是存储卷? 存储卷就是: “将宿主机的本地文件系统中存在的某个目录&#xff0c;与容器内部的文件系统上的某一目录建立绑定关系”。 存储卷与容器本身的联合文件系统&#xff1f; 在宿主机上的这个与容器形成绑定关系…

3D生成式AI模型与工具

当谈到技术炒作时&#xff0c;人工智能正在超越虚拟世界&#xff0c;吸引世界各地企业和消费者的注意力。 但人工智能可以进一步增强虚拟世界&#xff0c;至少在某种意义上&#xff1a;资产创造。 AI 有潜力扩大用于虚拟环境的 3D 资产的创建。 AI 3D生成使用人工智能生成3D模…

能碳双控| AIRIOT智慧能碳管理解决方案

在当前全球气候变化和可持续发展的背景下&#xff0c;建设能碳管理平台成为组织迎接挑战、提升可持续性的重要一环&#xff0c;有助于组织实现可持续发展目标&#xff0c;提高社会责任形象&#xff0c;同时适应未来碳排放管理的挑战。能碳管理是一个涉及跟踪、报告和减少组织碳…

C++面试宝典第32题:零钱兑换

题目 给定不同面额的硬币coins和一个总金额amount,编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,则返回-1。说明:你可以认为每种硬币的数量是无限的。 示例1: 输入:coins = [1, 2, 5], amount = 11 输出:3 解释:11 = …

ETL是什么

一、ETL概念 ETL&#xff0c;是英文Extract-Transform-Load的缩写&#xff0c;用来描述将数据从来源端经过抽取&#xff08;extract&#xff09;、转换&#xff08;transform&#xff09;、加载&#xff08;load&#xff09;至目的端的过程。ETL一词较常用在数据仓库&#xff…

光谱数据处理:1.特征波长优选的不同方法与Python实现

首先&#xff0c;我们要理解为什么要对“光谱数据进行特征波长优选”以及这是在干嘛&#xff0c;光谱数据可以想象成一长串的彩色条纹&#xff0c;每种颜色对应一个波长&#xff0c;就像彩虹一样。这些颜色的条纹代表了从某种物质&#xff08;比如植物、矿石或是食品&#xff0…

计网自顶向下:网络应用层【Web应用与HTTP协议】

目录 Web应用Web页URLWorld Wide Web 超文本传输协议——HTTP超文本C/S结构报文请求报文响应报文HTTP响应状态码try&#xff1a;在命令行里手工给web服务器发送请求 http连接的两种类型非持久&#xff08;http1.0&#xff09;持久&#xff08;http1.1&#xff09;▷ 流水线▷ 非…

【自然语言处理三-自注意self attention】

自然语言处理三-自注意力 self attention 自注意力是什么&#xff1f;自注意力模型出现的原因是什么&#xff1f;词性标注问题解决方法1-扩展window&#xff0c;引用上下文解决方法2-运用seq2seq架构新问题来了&#xff1a;参数量增加、无法并行的顽疾 自注意力self attention模…

C++ list详解以及模拟实现

目录 1.list的使用 1.1list的定义 1.2list的使用 1.3list iterator使用 1.4list capacity 1.5list element access 1.6list增删查改 2.list迭代器失效问题 3.list的模拟实现 1.list的使用 1.1list的定义 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容…

水印相机小程序源码

水印相机前端源码&#xff0c;本程序无需后端&#xff0c;前端直接导入即可&#xff0c;没有添加流量主功能&#xff0c;大家开通后自行添加 源码搜索&#xff1a;源码软件库 注意小程序后台的隐私权限设置&#xff0c;前端需要授权才可使用 真实时间地址拍照记录&#xff0c…