蓝桥杯每日一题 (递推、递归、)

3777. 砖块(每日一题)

后面if条件判断很巧妙,只要有一种成立就不管另一种了。

#include<bits/stdc++.h>
using namespace std;
//3777. 砖块
//跟贪心差不多
string s;
int t,n;void update(char &c)
{if(c=='W')c='B';else c='W';
}bool check(char c)
{vector<int>a;string ss=s;for(int i=0;i+1<n;i++){if(ss[i]!=c){update(ss[i]);update(ss[i+1]);a.push_back(i);}}if(ss.back()!=c)return false;cout<<a.size()<<endl;for(int i:a)cout<<i+1<<" ";if(a.size()>0)cout<<endl;return true;}
int main()
{cin>>t;for(int i=0;i<t;i++){cin>>n;cin>>s;if(!check('B')&&!check('W'))cout<<"-1"<<endl;}
}

1208. 翻硬币

和翻砖头一样,(赋值用成了==浪费了10min)

#include<bits/stdc++.h>
using namespace std;
//1208. 翻硬币
string s,t;
void update(int i)
{if(s[i]=='*')s[i]='o';else s[i]='*';
}
int main()
{cin>>s;cin>>t;int cnt=0;for(int i=0;i<s.size();i++){if(s[i]!=t[i]){update(i);update(i+1);cnt++;}}cout<<cnt<<endl;}

递归 1497 树的遍历

自己的做法如下(是错误的):没做出来:

#include<bits/stdc++.h>
using namespace std;
const int N=30;
//1497. 树的遍历(错误的)
vector<int>a(N);
vector<int>b(N);
vector<int>d(N);
unordered_map<int,int>mp;//某个点是在哪个位置
int n;void countt(int c,int cnt )
{if(cnt>n)return;int t=a[c];int pos=mp[t];d[cnt]=t;cnt*=2;countt(pos-1,cnt);countt(c-1,cnt+1);
}
int main()
{cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}//for(int i=1;i<=n;i++)cout<<a[i]<<endl;for(int i=1;i<=n;i++){cin>>b[i];mp[b[i]]=i;}countt(n,1);int num=1,lay=0;while(num<=n){for(int j=num;j<num+1<<lay;j++){cout<<d[j]<<" ";}lay++;num=2<<lay;}
}

y做法,递归的参数有四个。每层递归的作用就是找到后序遍历的最后一个结点,也就是根节点。找出其在中序遍历中的位置。相当于进行了一个划分。然后递归求左右子树的根节点,保存。最后返回根节点。递归的条件是:划分之后左子树的中序遍历左端点是否在pos左边,右端点是否在pos右边。

#include<bits/stdc++.h>
using namespace std;
const int N=30;
//1497. 树的遍历
int a[N],b[N];
unordered_map<int,int>l,r,p;//用来保存某个点的左右子树
int n;//每次返回左子树或者右子树
int build(int ml,int mr,int pl,int pr)
{int t=a[pr];//找到根节点的值int pos=p[t];//找到根节点的posif(ml<pos)l[t]=build(ml,pos-1,pl,pl+pos-1-ml);if(mr>pos)r[t]=build(pos+1,mr, pl+pos-ml,pr-1);return t;
}void bfs(int t)
{queue<int>q;q.push(t);while(!q.empty()){int u=q.front();cout<<u<<" ";q.pop();if(l.count(u))q.push(l[u]);if(r.count(u))q.push(r[u]);}}int main()
{int n;cin>>n;for(int i=0;i<n;i++){cin>>a[i];}for(int i=0;i<n;i++){cin>>b[i];p[b[i]]=i;//保存中序位置}int t=build(0,n-1,0,n-1);bfs(t);}

//1249. 亲戚

找亲戚问题:我犯的错是:让f【l】=find(r)。我只想到了两个人有亲戚就这样赋值。

其实是错误的,两个人有亲戚是代表着两个大集合之间实现了连通,所以要找到l的祖先赋值为r的祖先,这样就能代表整个集合。否则只有l能和r有亲戚。

#include<bits/stdc++.h>
using namespace std;
const int N=20000;
//1249 亲戚
int f[N];
int findf(int x)
{if(f[x]==x)return x;else return findf(f[x]);
}
int main()
{int n,m;cin>>n>>m;for(int i=1;i<=n;i++)f[i]=i;for(int i=0;i<m;i++){int l,r;cin>>l>>r;f[findf(l)]=findf(r);}int q;cin>>q;for(int i=0;i<q;i++){int l,r;cin>>l>>r;if(findf(l)==findf(r))cout<<"Yes"<<endl;else cout<<"No"<<endl;}}

//836合并集合

此题思路没有问题了,但是在输入上有问题。

复习了getcahr();

当我们希望读取一行字符,包括其中的空格的时候一定要加上getchar(),因为前面遗留了一个换行符号。

 cin>>n>>m;//getchar();//这个时候如果没有getchar,s就会读取换行符号getline(cin,s);cout<<s;

 getline之间不用加(cin会把换行符留在缓冲区里面,等待被其他变量获取,而getline会读取换行符,并丢弃掉)

cin>>n>>m;getchar();//这个时候如果没有getchar,s就会读取换行符号getline(cin,s);getline(cin,s);cout<<s;
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
//836 合并集合
//(重点是怎么处理字符串)
char s[2];
int n,m;
int f[N];int getf(int x)
{if(f[x]==x)return x;else return getf(f[x]);
}int main()
{cin>>n>>m;for(int i=1;i<=n;i++)f[i]=i;while(m--){int l,r;scanf("%s%d%d", s, &l, &r);if(s[0]=='M'){f[getf(l)]=getf(r);}else{if(getf(l)==getf(r))puts("Yes");else puts("No");}}}

// 837 连通块中点的数量

做出来了,但是TLE

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
//837 连通块中点的数量 TLE
int n,m;
char s[2];
int l,r;
int f[N];int getf(int x)
{if(f[x]==x)return x;else return getf(f[x]);
}int main()
{cin>>n>>m;for(int i=1;i<=n;i++)f[i]=i;while(m--){cin>>s;if(s[0]=='C'){cin>>l>>r;f[getf(l)]=getf(r);}else if(s[0]=='Q'&&s[1]=='1'){cin>>l>>r;if(getf(l)==getf(r)){cout<<"Yes"<<endl;}else cout<<"No"<<endl;}else{int cnt=0;cin>>l;for(int i=1;i<=n;i++){if(getf(i)==getf(l)){cnt++;}}cout<<cnt<<endl;}}
}

y做法:自己的做法的错误:在计算一个连通子块的时候可以用数组存。因为每个子块一定有一个唯一的共同的祖先。用这个点存cnt值。

并查集太博大精深了,以前觉得很好理解,其实里面还有很多细节,在用cnt存的时候,只有两个结点不在同一个集合里面才能,加cnt。否则会重复。

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
//837 连通块中点的数量
int n,m;
char s[2];
int l,r;
int f[N];
int cnt[N];
int getf(int x)
{if(f[x]==x)return x;else return getf(f[x]);
}int main()
{cin>>n>>m;for(int i=1;i<=n;i++)f[i]=i,cnt[i]=1;while(m--){cin>>s;if(s[0]=='C'){cin>>l>>r;if(getf(r)!=getf(l)){f[getf(l)]=getf(r);cnt[getf(r)]+=cnt[getf(l)];}}else if(s[0]=='Q'&&s[1]=='1'){cin>>l>>r;if(getf(l)==getf(r)){cout<<"Yes"<<endl;}else cout<<"No"<<endl;}else{cin>>l;cout<<cnt[getf(l)]<<endl;}}}

240 食物链(带权并查集)

思考时的难点是三个种群的区别。

这道题不是一个种群一个集合了,是一个完整的食物网一个集合。

食物网的每条路一定是按照题目给出的食物三角形走的。所以对于同一个食物网上的两个物种,判断其关系。就要有一个起点,也就是这个食物网的祖先结点。计算到根节点的距离。得到相对距离取模。

对于没有在同一个网上的两个同类物种。一定是对的。(只要我们更新好d)。让x的祖先结点指向y的祖先结点。且更新d为dy-dx。这样就保证捕食关系正确了。

#include<bits/stdc++.h>
using namespace std;
const int N=50010;
//240食物链
int f[N];
int d[N];
int getf(int x)
{if(f[x]==x)return x;else{int t=getf(f[x]);d[x]+=d[f[x]];//计算到根节点的距离//先保存d,再更新f[x]f[x]=t;}return f[x];
}int main()
{int n,m,cnt=0;cin>>n>>m;for(int i=1;i<=n;i++)f[i]=i;int res=0;while(m--){int t,x,y;cin>>t>>x>>y;if(x>n||y>n)cnt++;else{int px=getf(x);int py=getf(y);if(t==1){if(px==py&&(d[x]-d[y])%3)cnt++;else if(px!=py){f[px]=py;d[px]=(d[y]-d[x]);}}else{//正常情况下应该相差1if(px==py&&(d[x]-d[y]-1)%3)cnt++;else if(px!=py){f[px]=py;d[px]=d[y]-d[x]+1;}}}}cout<<cnt;return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

shell文本处理工具-shell三剑客1

shell脚本常用基础命令2 shell脚本常用基础命令 shell脚本常用基础命令2一、grep用法二、sed用法2.1p参数 &#xff08;显示&#xff09;n参数&#xff08;只显示处理过的行&#xff09; 文本处理三剑客&#xff1a;grep sed awk 一、grep用法 grep -E egrep (扩展搜索正文表…

NUMA简介

NUMA 1 什么是NUMA 早期的计算机&#xff0c;内存控制器还没有整合进 CPU&#xff0c;所有的内存访问都需要经过北桥芯片来完成。如下图所示&#xff0c;CPU 通过前端总线&#xff08;FSB&#xff0c;Front Side Bus&#xff09;连接到北桥芯片&#xff0c;然后北桥芯片连接到…

如何查看一个进程有几个子进程

要查看一个进程有多少个子进程&#xff0c;一种方法是通过在命令行上使用 ps 命令结合 pgrep 命令。 pgrep -P <parent_pid> | wc -l其中&#xff1a; <parent_pid> 是你要查看的父进程的进程号&#xff08;PID&#xff09;。 这个命令会列出指定父进程的所有子…

Java集合详解(单列集合 | 双列集合 | Collections集合工具类)

○ 前言&#xff1a; 在开发实践中&#xff0c;我们需要一些能够动态增长长度的容器来保存我们的数据&#xff0c;java中为了解决数据存储单一的情况&#xff0c;java中就提供了不同结构的集合类&#xff0c;可以让我们根据不同的场景进行数据存储的选择&#xff0c;如Java中提…

xpath基础入门

一、XPath是什么 XPath 定位 HTML 文档中的元素的工具 XPath 是一种表达语言&#xff0c;旨在支持XML文档的查询或转换。 XPath由万维网联盟(W3C) 于 1999 年定义。 XPath支持 XML 的应用程序&#xff08;例如 Web 浏览器&#xff09;和许多编程语言都支持 XPath。 XPath 语言…

Tensorflow2.0笔记 - 均方差MSE和交叉熵CROSS ENTROPHY作为损失函数

本笔记主要记录使用MSE和交叉熵作为loss function时的梯度计算方法。 import tensorflow as tf import numpy as nptf.__version__#softmax函数使用 #参考资料&#xff1a;https://blog.csdn.net/u013230189/article/details/82835717 #简单例子&#xff1a; #假设输出的LOGIT…

24计算机考研调剂 | 佳木斯大学

佳木斯大学计算机科学与技术、电子信息招调剂生 考研调剂招生信息 学校:佳木斯大学 专业:工学->电子信息 年级:2024 招生人数:- 招生状态:正在招生中 联系方式:********* (为保护个人隐私,联系方式仅限APP查看) 补充内容 黑龙江省自主智能与信息处理重点实验室马慧彬…

maven 安装

maven 安装 maven 下载解压添加自定义仓库位置修改配置文件环境变量配置测试idea 设置 maven 下载 下载 Apache Maven 解压 添加自定义仓库位置 repository 修改配置文件 修改 maven\conf\settings.xml 文件&#xff0c; 主要是 localRepository (更改自己路径) 和 mirro…

基于SpringBoot+Vue+ElementUI+Mybatis前后端分离管理系统超详细教程(五)——多条件搜索并分页展示

前后端数据交互 书接上文&#xff0c;我们上节课通过前后端数据交互实现了分页查询和单条件搜索分页查询的功能&#xff0c;最后留了个小尾巴&#xff0c;就是把其他两个搜索条件&#xff08;email,address&#xff09;也加进来&#xff0c;实现多条件搜索并分页展示。这节课我…

计算机网络-第5章 运输层(1)

主要内容&#xff1a;进程之间的通信与端口、UDP协议、TCP协议、可靠传输原理&#xff08;停止等待协议、ARQ协议&#xff09;、TCP报文首部、TCP三大题&#xff1a;滑动窗口、流量控制、拥塞控制机制 5.1 运输层协议概述 运输层向它上面的应用层提供通信服务&#xff0c;真正…

java技术面试100问?

当今软件开发领域中&#xff0c;Java作为一门广泛应用的编程语言&#xff0c;已经成为了众多企业和开发者的首选。其稳定性、可靠性以及丰富的生态系统&#xff0c;使其成为了构建各种类型应用的理想选择。然而&#xff0c;要想在竞争激烈的技术行业中脱颖而出&#xff0c;除了…

深入理解React中的useState:函数组件状态管理的利器

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

24计算机考研调剂 | 燕山大学【211】

燕山大学接收调剂研究生 考研调剂招生信息 学校:燕山大学 专业:工学->电子科学与技术->物理电子学 年级:2024 招生人数:5 招生状态:正在招生中 联系方式:********* (为保护个人隐私,联系方式仅限APP查看) 补充内容 要求考生一志愿报考211及以上全国重点院校&…

代码随想录算法训练营第四十八天| 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II

文章目录 1.买卖股票的最佳时机2.买卖股票的最佳时机II 1.买卖股票的最佳时机 给定一个数组 prices&#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择某一天买入这只股票&#xff0c;并选择在未来的某一个不同的日子卖出该股票。设计一个算…

嵌入式学习第二十六天!(网络传输:TCP编程、HTTP协议)

TCP通信&#xff1a; 1. TCP发端&#xff1a; socket -> connect -> send -> recv -> close 2. TCP收端&#xff1a; socket -> bind -> listen -> accept -> recv -> send -> close 3. TCP需要用到的函数&#xff1a; 1. co…

蓝桥杯2023真题(4)

1.景区导游&#xff08;树上前缀和、最近公共祖先&#xff09; 思路 路线&#xff1a;2 -> 6 -> 5 -> 1 1.一个点都不去去掉的花费记作sum 2.去掉第一个点&#xff0c;sum - cost[2 -> 6] 3.去掉第二个点&#xff0c;sum - cost[2 -> 6] - cost[6 -> 5] co…

计算机网络笔记(湖科大教书匠版本)

第一章、 ①三种交换方式 电路交换、分组交换、报文交换&#xff08;被分组交换所取代&#xff09; 1.电路交换&#xff1a;会一直占用通道&#xff0c;不适合计算机之间的数据通信 2.分组交换&#xff1a;通常我们把表示该数据的整块数据称为一个报文。 先把较长的报文划…

C++开发基础——std::future与async异步编程

一&#xff0c;std::future与std::promise std::future是一个类模板&#xff0c;存放了线程入口函数的返回结果&#xff0c;调用std::future对象的get()函数可以拿到返回结果。 std::promise也是一个类模板&#xff0c;可以基于std::promise实现线程之间的数据传输。 构造一…

AcWing 5407. 管道(二分,区间合并)

有一根长度为 l e n len len 的横向的管道&#xff0c;该管道按照单位长度分为 l e n len len 段&#xff0c;每一段的中央有一个可开关的阀门和一个检测水流的传感器。 一开始管道是空的&#xff0c;位于 L i L_i Li​ 的阀门会在 S i S_i Si​ 时刻打开&#xff0c;并不…

下载、安装并配置 Node.js

文章目录 1. 下载2. 自定义安装3. 添加环境变量4. 验证5. 修改下载位置6. npm 换源7. 测试 ➡️➡️➡️来源&#xff1a;Simplilearn.com Node.js 是一个开源、跨平台的 JavaScript 运行时环境和库&#xff0c;用于在客户端浏览器之外运行 web 应用程序。 Ryan Dahl 在2009年开…