码蹄集部分题目(2024OJ赛18期;并查集+ST表+贪心)

1🐋🐋史莱姆融合(钻石;并查集)

时间限制:1秒

占用内存:128M

🐟题目描述

🐟题目思路

这道题目使用并查集,同一集合的所有元素的最顶上的祖父节点是统一的。这里记录每个集合的最左端元素(最顶上的祖父节点)和最右端元素,便于集合更新。

MT3052 史莱姆融合_哔哩哔哩_bilibili

🐟代码

#include<bits/stdc++.h> 
​
using namespace std;
const int N=1e6+5;
int n,fa[N],so[N],nxt[N];//集合最左端fa,集合最右端so,下一个元素nxt
​
int find(int x) {return x==fa[x]?x:(fa[x]=find(fa[x]));}//找集合最左端元素
​
void merge(int i,int j)//集合合并
{int x=find(i),y=find(j);//两个集合的最左端if(x!=y){nxt[so[x]]=y;//第一个集合的最右端的下一个元素就是第二个集合的最左端元素fa[y]=x;//更新最左端so[x]=so[y];//更新最右端}
}
​
int main( )
{int x,y;cin>>n;for(int i=1;i<=n;i++) fa[i]=so[i]=i;for(int i=0;i<n-1;i++){cin>>x>>y;merge(x,y);}for(int i=find(1);i;i=nxt[i]) cout<<i<<" ";return 0;
}

2🐋🐋区间最小值(钻石;ST表)

时间限制:1秒

占用内存:128M

🐟题目描述

🐟题目思路

ST表用于解决区间最值问题,基于分治和倍增思想。

  • ST表中定义了一个二维数组mn[N] [M],mn[i] [j]表示区间[i, i + 2^j + 1]内的最大值

  • 根据倍增思想,给出状态转移方程mn[i] [j] = max(mn[i] [j - 1], mn[i + 2^j - 1^] [j - 1])

ST表详解推荐:ST表详解-CSDN博客

🐟代码

#include<bits/stdc++.h> 
​
using namespace std;
const int N=1e5+5;
int m,n,a[N],mn[N][50],Lg[N],ans;
​
void pre()
{Lg[1]=0;for(int i=2;i<=n;i++) Lg[i]=Lg[i>>1]+1;//求对数,得到每段的区间结束位置
}
​
void ST_create()
{for(int i=1;i<=n;i++) mn[i][0]=a[i];//mn[i][j],当j为0时,区间长度2^j为0,则区间最大值就是区间的唯一元素a[i]for(int j=1;j<=Lg[n];j++)//之前已经计算过区间长度为0的情况,这里区间长度由2^1 到 2^Lg[n] {for(int i=1;i<=n-(1<<j)+1;i++)//确定区间左端点,区间范围为[i, i + 2^j - 1],所以 i + 2^j - 1 <= n{mn[i][j]=min(mn[i][j-1],mn[i+(1<<(j-1))][j-1]);//状态转移方程}}
}
​
int ST_query(int l,int r)//区间查询
{int k=Lg[r-l+1];return min(mn[l][k],mn[r-(1<<k)+1][k]);
}
​
int main( )
{int a1,a2;cin>>n>>m;for(int i=1;i<=n;i++) cin>>a[i];pre();ST_create();while(m--){cin>>a1>>a2;cout<<ST_query(a1,a2)<<endl;}return 0;
}

3🐋🐋区间gcd(钻石;ST表)

时间限制:1秒

占用内存:64M

🐟题目描述

🐟题目思路

这道题目也是使用ST表,pre、create和query除了将min改成gcd没有变化,gcd使用递归的方式求取。

MT3051 区间gcd_哔哩哔哩_bilibili

🐟代码

用时少:

#include<bits/stdc++.h> 
​
using namespace std;
const int N=2e5+5;
int m,n,a[N],mn[N][50],Lg[N],ans;
​
int read()
{int ans=0;char ch=getchar();while(ch<'0'||ch>'9') ch=getchar();while(ch>='0'&&ch<='9'){ans=ans*10+ch-'0';ch=getchar();}return ans;
}
​
void write(int x)
{if(x>=10) write(x/10);putchar(x%10+'0');
}
​
int gcd(int a,int b){return b==0?a:gcd(b,a%b);}
​
void pre()
{Lg[1]=0;for(int i=2;i<=n;i++) Lg[i]=Lg[i>>1]+1;//求对数,得到每段的区间结束位置
}
​
void ST_create()
{for(int i=1;i<=n;i++) mn[i][0]=a[i];//mn[i][j],当j为0时,区间长度2^j为0,则区间最大值就是区间的唯一元素a[i]for(int j=1;j<=Lg[n];j++)//之前已经计算过区间长度为0的情况,这里区间长度由2^1 到 2^Lg[n] {for(int i=1;i<=n-(1<<j)+1;i++)//确定区间左端点,区间范围为[i, i + 2^j - 1],所以 i + 2^j - 1 <= n{mn[i][j]=gcd(mn[i][j-1],mn[i+(1<<(j-1))][j-1]);//状态转移方程}}
}
​
int ST_query(int l,int r)//区间查询
{int k=Lg[r-l+1];return gcd(mn[l][k],mn[r-(1<<k)+1][k]);
}
​
int main( )
{int a1,a2;n=read();m=read();for(int i=1;i<=n;i++) a[i]=read();pre();ST_create();while(m--){a1=read();a2=read();ans=ST_query(a1,a2);write(ans);putchar('\n');}return 0;
}

占内存少:

摘自——小码_63705

#include<bits/stdc++.h> 
​
using namespace std;
const int N=3e5+5;
​
int gcd(int a,int b)
{if(!b) return a;else return gcd(b,a%b);
}
​
int dp[N][20],a[N],len[N];
​
int query(int l,int r)
{int k=len[r-l+1];return gcd(dp[l][k],dp[r-(1<<k)+1][k]);
}
​
inline int read()
{char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}
​
int main( )
{len[0]=1;for(int i=2;i<N-2;i++) len[i]=len[i/2]+1;int n;n=read();int ncase;ncase=read();for(int i=1;i<=n;i++) {*(a+i)=read();dp[i][0]=a[i];}for(int j=1;j<=len[n];j++){for(int i=1;i<=n;i++){dp[i][j]=gcd(dp[i][j-1],dp[i+(1<<j-1)][j-1]);}}while(ncase--){int l=read(),r=read();printf("%d\n",query(l,r));}return 0;
}

4🐋🐋检测敌人(钻石;贪心)

时间限制:1秒

占用内存:128M

🐟题目描述

🐟题目思路

贪心思路:一个设备检测尽可能多的敌人。

不同于用设备找敌人,这道题目需要用敌人找设备,以敌人为圆心画圈,找到可用检测到我的x轴上的所有范围,那么在这个范围内放设备都可以检测到我。

贪心的实现就是通过对比两个区间是否有重叠,得知可否共用设备。

【码蹄集进阶塔全题解08】算法基础:贪心 MT2080 – MT2092_哔哩哔哩_bilibili

🐟代码

#include<bits/stdc++.h> 
​
using namespace std;
const int N=1005;
struct node
{double x,y,l,r;bool v;
}e[N];
​
bool cmp(node a,node b)
{return a.r<b.r;
}
​
int main( )
{int n;double r;while(cin>>n>>r&&!(n==0&&r==0)){bool flag=false;memset(e,0,sizeof(e));for(int i=1;i<=n;i++){cin>>e[i].x>>e[i].y;if(r*r<e[i].y*e[i].y) flag=true;//以每个敌人为圆心画圆,圆圈范围内的仪器能检测到敌人else//计算能检测到敌人的x轴坐标范围{e[i].l=-sqrt(r*r-e[i].y*e[i].y)+e[i].x;e[i].r=sqrt(r*r-e[i].y*e[i].y)+e[i].x;e[i].v=false;}}if(flag){cout<<-1<<endl;continue;}sort(e+1,e+1+n,cmp);int ans=0;for(int i=1;i<=n;i++){if(e[i].v==false)//表示这个敌人还没能被检测到{for(int j=i;j<=n;j++){if(e[j].v==false&&e[j].l<=e[i].r&&e[j].r>=e[i].r) e[j].v=true;//我们有重叠区域,用一个设备就行了}e[i].v=true;ans++;//所需设备数加一}}cout<<ans<<endl;}return 0;
}

5🐋🐋小码哥的福利(钻石;贪心)

时间限制:1秒

占用内存:128M

🐟题目描述

🐟题目思路

贪心思路:每次分甜品都要尽可能地达到平均值。

这道题目的思路就是,将所有手下按耐受度排序,将所有甜品按甜度排序;找到能吃掉这个甜品的手下,让他全部吃掉;然后对所有手下吃掉的甜品数量进行分配。根据耐受度限制,甜品只能往右分,也就是往耐受度高的手下那里分,那么每次都计算出来从我到最后一个手下我们吃的甜品数量的平均值,然后如果我吃的比这个平均值多,就把多的甜品分给下一个人,以此类推我从头遍历到尾。

【码蹄集进阶塔全题解08】算法基础:贪心 MT2080 – MT2092_哔哩哔哩_bilibili

🐟代码

#include<bits/stdc++.h> 
​
using namespace std;
#define ll long long
const int N=55;
ll n,m,a[N],sum[N],ans;
struct node
{ll b,c;
}sweet[N];
​
int cmp(node a,node b){return a.b<b.b;}
​
ll add(int l,int r)
{ll ans=0;for(int i=l;i<=r;i++) ans+=sum[i];return ans;
}
​
int main( )
{cin>>n;ll maxm=0;for(int i=1;i<=n;i++){cin>>a[i];maxm=max(maxm,a[i]);}sort(a+1,a+1+n);cin>>m;for(int i=1;i<=m;i++){cin>>sweet[i].b;if(sweet[i].b>maxm)//甜品的甜度超过手下的最大甜品耐受度了,无法吃完{cout<<-1<<endl;return 0;}}for(int i=1;i<=m;i++) cin>>sweet[i].c;sort(sweet+1,sweet+1+m,cmp);//按照甜度大小排列for(int i=1;i<=m;i++)//遍历所有甜品i{for(int j=1;j<=n;j++)//遍历所有手下j{if(sweet[i].b<=a[j]){sum[j]+=sweet[i].c;//手下j吃掉甜度为i的所有甜品break;}}}//平均化吃掉的数量//甜品转移只能向右转移,也就是转移给耐受度更高的手下for(int i=1;i<=n;i++)//遍历所有手下{ll tmp=(add(i,n))/(n-i+1);//将往右的这些所有吃的甜品数量平均if(tmp<=sum[i])//这个人吃多了,分走甜品{sum[i+1]+=sum[i]-tmp;sum[i]=tmp;}}for(int i=1;i<=n;i++) ans=max(ans,sum[i]);//找出最大sumcout<<ans<<endl;return 0;
}

6🐋🐋屠龙勇者(黄金;贪心)

时间限制:1秒

占用内存:128M

🐟题目描述

🐟题目思路

贪心思想:用最强的勇士砍最大的头。

那么就是将d和w数组分别排序,最多有m-n个spare的勇士可以用来砍这个头,所以对i来说最强的勇士就是第i+m-n个勇士,如果这个最强的勇士都没法砍这个头,那么就失败了。同样的贪心思想,这些spare的勇士也是能力值低的那些。

🐟代码

#include<bits/stdc++.h> 
​
using namespace std;
const int N=1e5+5;
int d[N],w[N],n,m;
int main( )
{cin>>n>>m;for(int i=1;i<=n;i++) cin>>d[i];for(int i=1;i<=m;i++) cin>>w[i];sort(d+1,d+1+n);sort(w+1,w+1+m);if(n>m){cout<<"NO";return 0;}for(int i=n;i>=1;i--){if(w[i+m-n]<d[i])//最多有m-n个spare的勇士{cout<<"NO";return 0;}}cout<<"YES";return 0;
}

有问题我们随时评论区见~

⭐点赞收藏不迷路~

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

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

相关文章

获取当前周周一和周日的日期(格式20240607)

获取当前周周一和周日的日期&#xff08;格式20240607&#xff09; function getWeekStartAndEndDate() {const today new Date() // 获取当前日期const dayOfWeek today.getDay() // 获取今天是周几&#xff0c;返回值是0&#xff08;周日&#xff09;到6&#xff08;周六&…

逆波兰表达式

目录 一、定义 二、算法步骤 三、代码实现 一、定义 逆波兰表达式又叫做后缀表达式&#xff0c;是一种没有括号&#xff0c;并严格遵循“从左到右”运算的后缀式表达方法。 二、算法步骤 1、首先构造一个运算符栈&#xff0c;此运算符在栈内遵循越往栈顶优先级越高的原则。 …

20240607每日通信--------VUE3前端引入scoket-io,后端引入Netty-SocketIO,我成功了,希望一起交流沟通

无语 前置&#xff1a; VUE3 前端集成scoket-io socket.io-client Sringboot 3.0JDK17集成Netty-SocketIO Netty-SocketIO 失败原因一&#xff1a; 前期决定要写demo时候&#xff0c;单独了解了&#xff0c;后端引入Netty-SocketIO注意事项&#xff0c;详见我先头写的博客 前…

路径

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 用于定位一个文件或者目录的字符串被称为一个路径。在程序开发时&#xff0c;通常涉及两种路径&#xff0c;一种是相对路径&#xff0c;另一种是绝对…

G5 - Pix2Pix理论与实战

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目录 理论知识图像翻译CGANU-NetPix2Pix损失函数模型结构生成器差别器 模型效果总结与心得体会 理论知识 前面已经学习了GAN与CGAN&#xff0c;这节开始学习P…

LeetCode1143最长公共子序列

题目描述 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xff08…

大厂真实面试题(一)

滴滴大数据sql 取出累计值与1000差值最小的记录 1.题目 已知有表t_cost_detail包含id和money两列,id为自增,请累加计算money值,并求出累加值与1000差值最小的记录。 2.分析 本题主要是想找到累加值域1000差距最小的记录,也就是我们要对上述按照id进行排序并且累加,并…

【机器学习基础】Python编程06:五个实用练习题的解析与总结

Python是一种广泛使用的高级编程语言,它在机器学习领域中的重要性主要体现在以下几个方面: 简洁易学:Python语法简洁清晰,易于学习,使得初学者能够快速上手机器学习项目。 丰富的库支持:Python拥有大量的机器学习库,如scikit-learn、TensorFlow、Keras和PyTorch等,这些…

婚恋网源码 相亲交友小程序源码

婚恋网源码 相亲交友小程序源码 1、婚恋相亲交友系统 超大型婚恋社交、相亲、征婚、互动系统&#xff0c;继承了此前O2O、SNS及B2C的优秀特点 2、媒婆推广返利系统 针对广大婚恋网站运营者而推出的一套共享返利婚恋模式&#xff0c;全民红娘&#xff0c;会员裂变式增长 3、…

VBA语言専攻通知20240608

通知20240608 各位学员∶本周MF系列VBA技术资料增加621-625讲&#xff0c;T3学员看到通知后请免费领取,领取时间6月7日晚上19:00-6月8日晚上20:00。本次增加内容&#xff1a; MF621:为组合框添加工作表数据 MF622:在代码中使用π值 MF623:在窗体上使用切换按钮 MF624:删除…

Windows下安装和配置Redis

目录 1、下载redis压缩包 2、解压redis文件 3、启动redis临时服务 4、打开Redis客户端进行连接 5、使用一些基础操作来测试 5.1、输入ping命令来检测redis服务器与redis客户端的连通性 5.2、使用set和get命令测试redis数据库进行数据存储和获取 5.3、在命令中通过shut…

flowable 工作流从入门到精通

HelloWorld 语雀文档地址&#xff1a; https://www.yuque.com/paomian-ldog4/by12xp/uqg6yhhgzeinaxge#snmoq 相关文档 https://tkjohn.github.io/flowable-userguide/ 文档手册 https://github.com/flowable/flowable-engine/releases/tag/flowable-6.8.0 flowable-ui下载地…

将小爱音箱接入 ChatGPT 和豆包ai改造成专属语音助手

这个GitHub项目&#xff0c;mi-gpt&#xff0c;旨在将小爱音箱和米家设备与ChatGPT和豆包集成&#xff0c;有效地将这些设备转变为个性化语音助手。以下是对其功能和设置的详细分析&#xff1a; 主要特点 角色扮演&#xff1a;该项目允许小爱适应不同的角色&#xff0c;如伴侣…

【TB作品】MSP430F5529 单片机,简单电子琴

使用MSP430制作一个简单电子琴 作品功能 这个项目基于MSP430单片机&#xff0c;实现了一个简单的电子琴。通过按键输入&#xff0c;电子琴可以发出对应的音符声音。具体功能包括&#xff1a; 按下按键时发出对应音符的声音。松开按键时停止发声。支持C调低音、中音和高音。 …

python词云生成库-wordcloud

内容目录 一、模块介绍二、WordCloud常用的方法1. generate(self, text)2. generate_from_frequencies(frequencies)3. fit_words(frequencies)4. generate_from_text(text) 三、进阶技巧1. 设置蒙版2. 设置过滤词 WordCloud 是一个用于生成词云的 Python 库&#xff0c;它可以…

关于安装typescript后运行tsc -v命令报错问题

报错信息&#xff1a; tsc 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 没有配置环境变量&#xff0c;使用npm命令查看typescript的安装目录&#xff1a; npm config get prefix 根据控制台输出的目录&#xff0c;配置path环境变量 tsc -v 运行成功&…

鸿蒙轻内核M核源码分析系列十七(3) 异常信息ExcInfo

本文中所涉及的源码&#xff0c;以OpenHarmony LiteOS-M内核为例&#xff0c;均可以在开源站点 https://gitee.com/openharmony/kernel_liteos_m 获取。鸿蒙轻内核异常钩子模块代码主要在components\exchook目录下。 1、异常信息的宏定义、枚举和结构体 在文件components\exch…

计算机组成实验---Cache的实现

直接映射 先看懂cache的映射原理&#xff0c;根据cache大小与主存大小来计算各个信号线的位数 各个信号线位数 主存地址在逻辑上分为区号、块号、块内地址 Cache结构 Cache访问原理 基本过程 状态机&#xff1a;“三段式”实现 6.3 Verilog 状态机 | 菜鸟教程 (runoob.com) …

算法:226. 翻转二叉树

给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[2,3,1]示例 3&#x…

服务监控-微服务小白入门(5)

背景 什么是服务监控 监视当前系统应用状态、内存、线程、堆栈、日志等等相关信息&#xff0c;主要目的在服务出现问题或者快要出现问题时能够准确快速地发现以减小影响范围。 为什么要使用服务监控 服务监控在微服务改造过程中的重要性不言而喻&#xff0c;没有强大的监控…