2.5学习总结9

并查集

知识点

并查集是一种数据结构,用于处理一些不相交集合的合并及查询问题。它支持两种操作:

  1. Find(x):查找元素 x 所属的集合。
  2. Union(x, y):将元素 x 所属的集合和元素 y 所属的集合合并。

初始化:将每个元素单独作为一个集合。

int father[10010];
void init(int n)
{for(int i=1;i<=n;i++)father[i]=i;
}

查找:确定某个元素所属的集合。

int find(int i)
{if(i==father[i])return i;else father[i]=find(father[i]);return father[i];
}

合并:将两个集合合并成一个集合。

void unionn(int i,int j)
{int x=find(i);int y=find(j);father[x]=y;
}

并查集的时间复杂度为O(log*n),其中n是元素的个数。

P3367 【模板】并查集

题目描述

如题,现在有一个并查集,你需要完成合并和查询操作。

输入格式

第一行包含两个整数 N,M ,表示共有 N 个元素和 M 个操作。

接下来 M 行,每行包含三个整数 Zi​,Xi​,Yi​ 。

当 Zi​=1 时,将 Xi​ 与 Yi​ 所在的集合合并。

当 Zi​=2 时,输出 Xi​ 与 Yi​ 是否在同一集合内,是的输出 Y ;否则输出 N 。

输出格式

对于每一个 Zi​=2 的操作,都有一行输出,每行包含一个大写字母,为 Y 或者 N 。

输入输出样例

输入 #1复制

4 7
2 1 2
1 1 2
2 1 2
1 3 4
2 1 4
1 2 3
2 1 4

输出 #1复制

N
Y
N
Y

说明/提示

对于 30%30% 的数据,N≤10,M≤20。

对于 70%70% 的数据,N≤100,M≤10^3。

对于 100%100% 的数据,1≤N≤10^4,1≤M≤2×10^5,1≤Xi​,Yi​≤N,Zi​∈{1,2}。

#include<stdio.h>
int father[10010];
void init(int n)
{for(int i=1;i<=n;i++)father[i]=i;
}//初始化
int find(int i)
{if(i==father[i])return i;else father[i]=find(father[i]);return father[i];
}//查找
void unionn(int i,int j)
{int x=find(i);int y=find(j);father[x]=y;
}//合并
int main()
{int i,n,m,z,x,y;scanf("%d %d",&n,&m);init(n);for(i=1;i<=m;i++){scanf("%d %d %d",&z,&x,&y);if(z==1) unionn(x,y);else {if(find(x)==find(y))printf("Y\n");//祖先相同,位于同一集合else printf("N\n");}}    
}

P1111 修复公路

题目背景

A 地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车。政府派人修复这些公路。

题目描述

给出 A 地区的村庄数 N,和公路数 M,公路是双向的。并告诉你每条公路的连着哪两个村庄,并告诉你什么时候能修完这条公路。问最早什么时候任意两个村庄能够通车,即最早什么时候任意两条村庄都存在至少一条修复完成的道路(可以由多条公路连成一条道路)。

输入格式

第 1 行两个正整数 N,M。

下面 M 行,每行 3 个正整数 x,y,t,告诉你这条公路连着 x,y 两个村庄,在时间t时能修复完成这条公路。

输出格式

如果全部公路修复完毕仍然存在两个村庄无法通车,则输出 −1,否则输出最早什么时候任意两个村庄能够通车。

输入输出样例

输入 #1复制

4 4
1 2 6
1 3 4
1 4 5
4 2 3

输出 #1复制

5

说明/提示

1≤x,y≤N≤10^3,1≤M,t≤10^5。

#include<bits/stdc++.h>
using namespace std;
struct  road
{int x,y,t;
}a[100010],b;
bool operator < (road a,road b){return a.t<b.t;}
int father[1010];
void init(int n)
{for(int i=1;i<=n;i++)father[i]=i;
}//初始化
int find(int i)
{if(i==father[i])return i;return father[i]=find(father[i]);
}//查找
int main()
{int i,j,n,m,x,y,cnt=0,max=0;scanf("%d %d",&n,&m);init(n);for(i=1;i<=m;i++)scanf("%d %d %d",&a[i].x,&a[i].y,&a[i].t);sort(a+1,a+1+m);//对a[i].t排序for(i=1;i<=m;i++) {int x=find(a[i].x);int y=find(a[i].y);if(x==y)continue;father[x]=y;//合并cnt++;max=a[i].t<max?max:a[i].t;}if(cnt!=n-1)printf("-1");else printf("%d",max);
}

P1455 搭配购买

题目描述

明天就是母亲节了,电脑组的小朋友们在忙碌的课业之余挖空心思想着该送什么礼物来表达自己的心意呢?听说在某个网站上有卖云朵的,小朋友们决定一同前往去看看这种神奇的商品,这个店里有 n 朵云,云朵已经被老板编号为 1,2,3,...,n,并且每朵云都有一个价值,但是商店的老板是个很奇怪的人,他会告诉你一些云朵要搭配起来买才卖,也就是说买一朵云则与这朵云有搭配的云都要买,电脑组的你觉得这礼物实在是太新奇了,但是你的钱是有限的,所以你肯定是想用现有的钱买到尽量多价值的云。

输入格式

第一行输入三个整数,n,m,w,表示有 n 朵云,m 个搭配和你现有的钱的数目。

第二行至 n+1 行,每行有两个整数,ci​,di​,表示第 i 朵云的价钱和价值。

第 n+2 至 n+1+m 行 ,每行有两个整数 ui​,vi​。表示买第 ui​ 朵云就必须买第 vi​ 朵云,同理,如果买第 vi​ 朵就必须买第 ui​ 朵。

输出格式

一行,表示可以获得的最大价值。

输入输出样例

输入 #1复制

5 3 10
3 10
3 10
3 10
5 100
10 1
1 3
3 2
4 2

输出 #1复制

1

说明/提示

  • 对于 30%30% 的数据,满足 1≤n≤100;

  • 对于 50%50% 的数据,满足 1≤n,w≤10^3,1≤m≤100;

  • 对于 100%100% 的数据,满足 1≤n,w≤10^4,0≤m≤5×10^3。

一道并查集+01背包题,01背包的限制条件为买A必须买B,故可以用并查集将几个物品合成一个大物品,然后再用01背包问题做即可。

#include<bits/stdc++.h>
using namespace std;
int father[10010],c[10010],d[10010],dp[10010];
int find(int i)
{if(i==father[i])return i;return father[i]=find(father[i]);
}//查找
void unionn(int i,int j)
{int x=find(i);int y=find(j);if(x!=y){father[x]=y;c[y]=c[y]+c[x];d[y]=d[y]+d[x];}
}//合并物品,将价值,价钱分别相加
int main()
{int n,m,w,i,j;cin>>n>>m>>w;for(i=1;i<=n;i++){cin>>c[i]>>d[i];father[i]=i;}for(i=1;i<=m;i++){int x,y;cin>>x>>y;unionn(x,y);}for(i=1;i<=n;i++){if(father[i]==i){for(j=w;j>=c[i];j--)dp[j]=max(dp[j],dp[j-c[i]]+d[i]);}}//0-1背包问题解法printf("%d",dp[w]);
}

二分查找

知识点

二分查找是一种在有序数组中查找某一元素的算法。它的基本思想是将数组分为两部分,然后判断目标元素在左边还是右边,再在相应的部分中进行查找,重复这个过程,直到找到目标元素或者确定目标元素不存在。

具体步骤如下:

1. 声明两个指针,一个指向数组的开头,一个指向数组的末尾。

2. 计算数组中间元素的下标,可以使用 mid = ( low+high ) / 2。

3. 比较中间元素与目标元素的大小:

  • 如果中间元素等于目标元素,说明找到了目标元素,返回其下标。
  • 如果中间元素大于目标元素,说明目标元素在数组的左边,移动右指针到中间元素的前一个位置。
  • 如果中间元素小于目标元素,说明目标元素在数组的右边,移动左指针到中间元素的后一个位置。

4. 重复步骤2和步骤3,直到找到目标元素或者确定目标元素不存在。

二分查找的时间复杂度是 O(log n),其中 n 是数组的长度。这是由于每次查找都将查找范围缩小一半。

int binarySearch(int arr[],int low,int high,int target) 
{while(low<=high) {int mid=(low+high)/2;// 如果目标值等于中间值,则返回中间索引if (arr[mid]==target) return mid;// 如果目标值小于中间值,则在左半部分查找if (arr[mid]>target) high=mid-1;// 如果目标值大于中间值,则在右半部分查找if (arr[mid]<target) low=mid+1;}// 如果没有找到目标值,则返回-1return -1;
}

P2759 奇怪的函数

题目描述

使得 x^x 达到或超过 n 位数字的最小正整数 x 是多少?

输入格式

一个正整数 n。

输出格式

使得 x^x 达到 n 位数字的最小正整数 x。

输入输出样例

输入 #1复制

11

输出 #1复制

10

说明/提示

对于全部数据,1≤n≤2×10^9。

#include<stdio.h>
#include<math.h>
int main()
{long long n,num,mid,low=1,high=2000000000;scanf("%lld",&n);while(low<high){mid=(low+high)/2;num=mid*log10(mid)+1;if(num<n)  low=mid+1;else high=mid;}printf("%lld",low);
}

P8800 [蓝桥杯 2022 国 B] 卡牌

题目描述

这天,小明在整理他的卡牌。

他一共有 n 种卡牌,第 i 种卡牌上印有正整数数 i(i∈[1,n]), 且第 i 种卡牌现有 ai​ 张。

而如果有 n 张卡牌,其中每种卡牌各一张,那么这 n 张卡牌可以被称为一套牌。小明为了凑出尽可能多套牌,拿出了 m 张空白牌, 他可以在上面写上数 i,将其当做第 i 种牌来凑出套牌。然而小明觉得手写的牌不太美观,决定第 i 种牌最多手写 bi​ 张。

请问小明最多能凑出多少套牌?

输入格式

输入共 3 行,第一行为两个正整数 n,m 。

第二行为 n 个正整数 a1​,a2​,…,an​ 。

第三行为 n 个正整数 b1​,b2​,…,bn​ 。

输出格式

一行,一个整数表示答案。

输入输出样例

输入 #1复制

4 5
1 2 3 4
5 5 5 5

输出 #1复制

3

说明/提示

【样例说明】

这 5 张空白牌中,拿 2 张写 1,拿 1 张写 2,这样每种牌的牌数就变为了 3,3,3,4,可以凑出 3 套牌,剩下 2 张空白牌不能再帮助小明凑出一套。

【评测用例规模与约定】

对于 30%30% 的数据,保证 n≤2000;

对于 100%100% 的数据,保证 n≤2×10^5;n≤2×105;ai​,bi​≤n;m≤n2 。

#include<bits/stdc++.h>
using namespace std;
long long a[200010],b[200010];
long long n,m;
long long low=0,high=1e7;
int check(int num)
{long long sum=0;for(int i=1;i<=n;i++){if(num-a[i]>b[i])return 0;sum=sum+max(num-a[i],(long long)0);}if(sum<=m) return 1;else return 0;
}
int cut()   
{while(low+1<high){int mid=(low+high)/2;if(check(mid)==1)low=mid;else high=mid;}if(check(high)==1)   return high;return low;
}            
int main()
{cin>>n>>m;for(int i=1;i<=n;i++)scanf("%lld",&a[i]);for(int i=1;i<=n;i++)scanf("%lld",&b[i]);cout<<cut();   
}

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

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

相关文章

探访成武非遗,感受文化传承魅力

为深入了解非遗文化&#xff0c;探究其时代内涵与精神价值。 2024年2月5日&#xff0c;曲阜师范大学计算机学院“古韵新声&#xff0c;格物致‘知’”实践队队员张悦在山东省菏泽市成武县开展社会实践活动&#xff0c;前往成武县文化馆进行实地参观&#xff0c;追寻非遗痕迹&am…

从零开始手写mmo游戏从框架到爆炸(二)— 核心组件抽离与工厂模式创建

上一章我们已经完成了一个基本netty的通信&#xff0c;但是netty的启动很多代码都是重复的&#xff0c;所以我们使用工厂模式来生成不同的ServerBootstrap。 首先创建一个新的组件core组件&#xff0c;和common组件&#xff0c;主要用于netty通信和工具类&#xff0c;从server…

JavaScript基础速成

由于学web时只学了后端&#xff0c;现在到了前后端联调的场景发现看不懂前端代码&#xff0c;于是开始恶补 看了下基础内容发现html和css比较好看懂&#xff0c;但JavaScript比较迷&#xff0c;大概知道组件id绑定事件 下面选取看菜鸟教程补充的JS知识 JS的作用 JS是在html…

PDF文件格式(一):新版格式交叉引用表

PDF交叉引用表是PDF的重要组成部分&#xff0c;本文介绍的是新交叉引用表&#xff0c;这种引用表的格式是PDF的obj格式&#xff0c;内容是被压缩存放在obj下的stream中&#xff0c;因此比常规的引用表格式复杂。下面就开始介绍这种交叉引用表的格式和解析的方法&#xff1a; 1…

文心一言4.0API接入指南

概述 文心一言是百度打造出来的人工智能大语言模型&#xff0c;具备跨模态、跨语言的深度语义理解与生成能力&#xff0c;文心一言有五大能力&#xff0c;文学创作、商业文案创作、数理逻辑推算、中文理解、多模态生成&#xff0c;其在搜索问答、内容创作生成、智能办公等众多…

LeetCode、790. 多米诺和托米诺平铺【中等,二维DP,可转一维】

文章目录 前言LeetCode、790. 多米诺和托米诺平铺【中等&#xff0c;二维DP&#xff0c;可转一维】题目与分类思路二维解法二维转一维 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质…

飞天使-k8s知识点12-kubernetes散装知识点1-架构有状态资源对象分类

文章目录 k8s架构图有状态和无状态服务 资源和对象对象规约和状态 资源的对象-资源的分类元数据型与集群型资源命名空间 k8s架构图 有状态和无状态服务 区分有状态和无状态服务有利于维护yaml文件 因为配置不同资源和对象 命令行yaml来定义对象对象规约和状态 规约 spec 描述…

嵌入式软件设计方式与方法

1、嵌入式软件与设计模式 思从深而行从简 软件开发&#xff0c;难的不是编写软件&#xff0c;而是编写功能正常的软件。软件工程化才能保证软件质量和项目进度&#xff0c;而设计模式使代码开发真正工程化&#xff0c;设计模式是软件工程的基石。 所谓设计模式就是对常见问题的…

idea(2023.3.3 ) spring boot热部署,修改热部署延迟时间

1、添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional> </dependency>载入依赖 2、设置编辑器 设置两个选项 设置热部署更新延迟时…

功率电阻器应用 (electroschematics.com)

功率电阻器的应用非常广泛&#xff0c;因此无法轻易地将其制成表格。这里讨论的是一些实用的、有用的应用程序&#xff0c;你会发现它们很有趣。首先是一些典型的管状功率电阻器的图像。 一些常见的功率电阻器应用 电阻加热器 电流检测 – 分流应用 缓冲器应用 泄放电阻 浪…

MC34063异常发热分析

问题描述&#xff1a; 工程现场反馈若干电源转换模块损坏&#xff0c;没有输出。拿到问题模块后&#xff0c;查看有一个MC34063周围的PCB有比较明显的高温痕迹&#xff0c;配套的电感也有明显的高温过热痕迹。 问题调查&#xff1a; MC34063的电路非常经典&#xff08;虽然自…

RabbitMQ 安装

下载erlang语言&#xff1a; erlang语言 下载RabbitMQ rabbitmq 安装erlang 1.以管理员身份安装erlang 2.弹出框选择next 3.选择安装路径&#xff0c;亦可以安装在默认路径 4.接下来一路点击下一步&#xff0c;无需任何修改&#xff0c;直到 install安装为止&#xff…

微服务限流(漏桶算法、令牌桶算法)

在微服务架构中&#xff0c;限流是一种重要的技术手段&#xff0c;用于控制服务接收的流量&#xff0c;以保护系统免受突发流量冲击。漏桶算法和令牌桶算法是两种常见的限流算法。同时&#xff0c;负载均衡策略和自定义负载均衡也是确保服务稳定性和高效性的关键措施。下面将深…

力扣:131. 分割回文串

回溯解法思路&#xff1a; 1.先声明一个集合来接受全部的回文子串组合&#xff0c;在声明一个集合来接收单个回文子串的组合。 2.写一个回溯函数&#xff0c;里面有终止条件和遍历全部组合的for循环来进行遍历全部的组合&#xff0c;终止条件为开始索引等于字符串的长度时&am…

政安晨:机器学习快速入门(二){基于Python与Pandas} {建立您的第一个机器学习模型}

现在咱们要一起创建您的第一个机器学习模型啦&#xff01; 选择建模数据 你的数据集包含太多变量&#xff0c;让你无法理解&#xff0c;甚至无法很好地打印出来。你如何将这大量的数据减少到你能理解的程度&#xff1f; 我们将从直觉上选择几个变量。后续课程将向你展示自动优…

【教学类-46-05】吉祥字门贴5.0(华光彩云_CNKI 文本框 空心字涂色 ,繁简都可以,建议简体)

作品展示 背景需求&#xff1a; 1、制作了空心字的第1款 华光通心圆_CNKI &#xff0c;发现它不能识别某些简体字&#xff0c;但可以识别他们的繁体字&#xff08;繁体为准&#xff09; 【教学类-46-01】吉祥字门贴1.0&#xff08;华光通心圆_CNKI 文本框 空心字涂色&#xf…

掌握Linux du命令:高效查看文件和目录大小

今天我们在生产环境中的服务器上收到了有关/var磁盘目录使用率较高的警报。为了解决这一问题&#xff0c;我们进行了/var目录下一些大文件的清理和转移操作。在查找那些占用磁盘空间较多的文件时&#xff0c;我们频繁使用了du命令。在Linux系统中&#xff0c;du命令是一款功能强…

Webpack插件浅析

常用的webpack插件功能介绍&#xff1a; 1.HotModuleReplacementPlugin 模块热更新插件。Hot-Module-Replacement的热更新是依赖于webpack-dev-server&#xff0c;有时是在打包文件改变时更新打包文件或者重新加载刷新整个页面&#xff0c;HMR是只更新修改的部分。 HotModul…

SpringBoot集成axis发布WebService服务

文章目录 1、使用maven-web项目生成server-config.wsdd文件1.1、新建maven-web项目1.1.1、新建项目1.1.2、添加依赖 1.2、编写服务接口和实现类1.2.1、OrderService接口1.2.2、OrderServiceImpl实现类 1.3、配置deploy.wsdd文件deploy.wsdd文件 1.4、配置tomcat1.4.1、配置tomc…

C++ Webserver从零开始:基础知识(八)——多线程编程

线程概述 现代Linux系统主要使用的线程库是NPTL&#xff0c;在Linux中可以通过 getconf GNU_LIBPTHREAD_VERSION 获取Linux线程库版本。谈到线程&#xff0c;就不得不提及线程模型 线程模型 本小节概念较多&#xff0c;采用问答式进行讲解&#xff0c;以帮助读者理解 什么…