码蹄集部分题目(第五弹;OJ赛2024年第10期)

🐋🐋🐋竹鼠通讯(钻石;分治思想;模板题:就算几何平面点对问题)

时间限制:3秒

占用内存:128M

🐟题目描述

在真空中,一块无限平坦光滑绝缘不导热草地上有很多光滑且相同球形竹鼠,它们的坐标为(xi,yi)。竹鼠之间会通过脑电波联系彼此。现在请问相距最近两只竹鼠的直线距离分别是多少(所有竹鼠都在草地的第一象限)?

🐟输入输出格式

输入格式:
第一行一个整数n;
接下来 nn行每行两个非负浮点数,xi,yi,表示第 i个点的 X 坐标与 Y 坐标。xi,yi都精确到小数点后两位。
​
输出格式:
一行,一个浮点数,最短距离。精确到小数点后4位。

🐟样例

🐚样例1

输入:
4
0.0 0.0
0.0 1.0
1.0 0.0
1.0 1.0
​
输出:
1.0000

🐚备注

其中:0≤n≤10^5,竹鼠的坐标数据范围在int型范围内。并且可能会有重叠的竹鼠。

🐟题目思路

经典的最近点对问题,用分治思想解决。

先说每一轮的思想:

  • 找到本轮的l、r、mid三条范围线,l是最左边的竹鼠所在的x位置,r是最右边的竹鼠所在的x位置,mid是l和r的中线

  • 最小距离只会出现在三种情况中:两个竹鼠都在左边,两个竹鼠都在右边,两个竹鼠跨中线

  • 分别求出两个竹鼠都在左边和都在右边的最小距离d,然后据此找出跨中线范围(mid±d)的竹鼠,将这些竹鼠按y排序,然后枚举任意两只竹鼠间的距离,找到最小距离即为结果

再说分治思想:

  • 切割整个l、r范围直到最小划分单位(l和r要么差0要么差1):

    • l=r,距离设为无穷大

    • l=r-1,直接返回两只竹鼠的距离

感谢官网用户——那是松石,提供的思路。

🐟代码

#include <bits/stdc++.h>
​
using namespace std;
#define INF 10000000000
const int N=1e5+10;
struct point
{
    double x, y;
}a[N];
​
int n,t[N];
double d=0;
​
bool cmp(point &a,point &b)//先按x排升序,x相等按y排升序
{
    if(a.x<b.x) return true;
    else if(a.x==b.x&&a.y<b.y) return true;
    else return false;
}
bool cmp2(int &i,int &j)//只按y排升序
{
    if(a[i].y<a[j].y) return true;
    else return false;
}
double dis(int i,int j)//计算距离
{
    double c=sqrt(pow(a[i].x-a[j].x,2)+pow(a[i].y-a[j].y,2));
    return c;
}
double solve(int l,int r)//l和r是所有竹鼠所在的x范围
{
    //分治中最小的两种任务情况:
    if(l==r) return INF;//左右范围重叠
    if(l==r-1) return dis(l,r);//左右范围没有重合,计算距离返回
    //距离最近的两个竹鼠只会是:全在左边、全在右边、跨中线三种情况之一
    int mid=(l+r)/2;//找到范围中线
    //分别求全在左边和全在右边的各自最小距离
    double d1=solve(l,mid);
    double d2=solve(mid+1,r);
    d=min(d1,d2);//得到全在左边和全在右边中的最小值
    int k=0;//记录跨中线范围内的竹鼠的数量
    //求跨中线的最小值
    for(int i=l;i<=r;i++)
    {
        //对中线左右各d范围内的竹鼠按y排序,遍历得到这些竹鼠中的最小距离
        if(fabs(a[i].x-a[mid].x)<=d)//fabs,返回浮点数的绝对值;记录范围内竹鼠的x坐标信息
        {
            t[k]=i;
            k++;
        }
        sort(t,t+k,cmp2);//按y排序
        for(int i=0;i<k;i++)//枚举这些竹鼠的两两配对情况,计算得到最小距离
        {
            for(int j=i+1;j<k&&a[t[j]].y-a[t[i]].y<d;j++)//从i+1开始,避免重复判断
            {
                d=min(d,dis(t[i],t[j]));
            }
        }
    }
    return d;
}
int main()
{
    cin>>n;
    for(int i=0;i<n;i++) cin>>a[i].x>>a[i].y;
    sort(a,a+n,cmp);
    printf("%.4f",solve(0,n-1));
    return 0;
}

🐋🐋🐋上色(星耀;递归分治)

时间限制:1秒

占用内存:128M

🐟题目描述

🐟输入输出格式

🐟样例

🐟题目思路

对每个区域有两种上色方式:竖着刷,需要l-r+1次;横着刷,次数需要计算。

如果横着刷,那就是刷到最短的那根的长度为止,剩下的部分继续判断是竖着刷还是横着刷。

不断横竖判断,最后结果就是横着刷和竖着刷的最小值。

递归的结束判断就是l>r了,也就是遍历完整个区域了。

感谢官方视频解析的思路。

🐟代码

#include <bits/stdc++.h>
​
using namespace std;
​
int n,m;
int h[5010];//记录还没刷的栅栏高度
 
int shu(int l,int r)//对l到r范围内的栅栏竖着刷,那就是栅栏的数量
{
    return r-l+1;
}
int heng(int l,int r)//横着刷
{
    int hmin=INT_MAX;
    for(int i=l;i<=r;i++)//找到该范围内最矮的栅栏,底下范围全部横着刷
    {
        hmin=min(h[i],hmin);
    }
    for(int i=l;i<=r;i++)//还剩下的还没刷,更新高度
    {
        h[i]-=hmin;
    }
    int ans=hmin;
    while(l<=r)
    {
        while(l<=r&&h[l]==0)//找到剩余还未刷的一个子区域的左边界l
        { 
            l++;
        }
        int rr=l;//本段从l开始的连续区域的右边界的下一个位置
        //※※※rr从l+1开始的话就超内存了,有没有懂的大佬帮忙解答下原因~
        while(rr<=r&&h[rr]!=0)//找到本段区域的右边界的下一个位置
        { 
            rr++;
        }
        //对本段区域进行递归调用,判断最小的次数
        ans+=min(heng(l,rr-1),shu(l,rr-1));
        l=rr;//到下一段连续区域
    }
    return ans;
}
 
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>h[i];
    cout<<min(heng(1,n),shu(1,n))<<endl;
    return 0;
}

🐋🐋🐋斐波那契数列(钻石;斐波那契数列性质求解最大公约数)

时间限制:1秒

占用内存:128M

🐟题目思路

大家都知道斐波那契数列即:f(1)=1,f(0)=0,f(i)=f(i−1)+f(i−2)(i≥2),现在请帮小码哥计算gcd⁡(f(n),f(m))的值。

🐟输入输出格式

输入格式:
第一行输入两个整数n,m(1≤n,m≤50000)。
​
输出格式:
输出一个整数代表gcd⁡(f(n),f(m)) 结果对1000000取模。

🐟样例

输入:
3 6
​
输出:
2

🐟题目思路

感谢官网用户——Silver,提供的思路。

🌮补充知识:斐波那契数列性质

前置知识:

  • 1:Fn和Fn+1互质

    • n=0时显然成立

    • n<=k-1时也成立:

      • 假设Fk和Fk-1互质,根据定义,Fk+1=Fk+Fk-1,假设存在d>1可以同时整除Fk+1和Fk,可知d也可以整除两者之差Fk-1,这与Fk和Fk-1互质矛盾

  • 2:Fn+m=FmFn+1+Fm-1Fn

    • 使用数学归纳法证明

    • m=1时,Fn+1=F1Fn+1+F0Fn=Fn+1成立

    • 假设m<=k时都成立:

      • 那么当m=k+1时,我们有Fn+k+1=Fn+k+Fn+k-1=(套用假设)FkFn+1+Fk-1Fn+Fk-1Fn+1+Fk-1Fn=(合并同类项)(Fk+Fk-1)Fn+1+(Fk-1+Fk-2)Fn=(斐波那契数列定义)=Fk+1Fn+1+FkFn,得证

据此可知(证明)最大公约数特性:

  • 根据前置知识2, 可以知道任何 Fn, Fm 的公约数, 都是 Fn+m的约数

  • 根据前置知识1、2,可以知道任何 Fn+m, Fn 的公约数 d, 都是 Fm 的约数

  • 根据以上两个结论, 我们知道 d 能整除 Fm, Fn 等价于 d 能整除 Fm+n, Fn

  • 推广上面的结论, 我们可以知道 d 能整除 Fm, Fn 等价于 d 能整除 Fm+kn, Fn

  • 注意到 m = m + kn (mod n), 我们用m替换 m+kn可以得到: d能整除 Fm % n, Fn等价于 d 能整除 Fm, Fn. 所以 gcd(Fm, Fn) = gcd(Fm%n, Fn). 这实际上就是欧几里得法求最大公约数的迭代过程, 迭代到最后可以得到gcd(Fm, Fn) = gcd(F0, Fgcd(m, n))

  • 由于 F0 =0, 且 gcd(0, x) = x, 我们得到 gcd(Fm, Fn) = Fgcd(m, n)

这道题目我们用到的特性就是:gcd(Fm, Fn) = Fgcd(m, n)

来源:TAOCP 学习记录 (1) - 斐波那契数列的最大公约数 · 瞎扯

🐟代码

#include<bits/stdc++.h> 
​
using namespace std;
​
int main( )
{
    long long n,m;
    cin>>n>>m;
    long long a=0,b=1,c=1;//F[0]、F[1]、F[2]
    long long x=__gcd(n,m);//调用标准库中的函数__gcd(int a,int b)来计算最大公约数
    if(x==0) cout<<a<<endl;//表示n和m没有公约数,根据特征,结果就是F0
    else if(x==1) cout<<b<<endl;//表示n和m的最大公约数是1,根据特征,结果就是F1
    else//n和m的最大公约数是x,根据特征,结果就是Fx
    {
        while(x>=2)//计算Fx
        {
            c=(a+b)%(long long)1e6;
            a=b;
            b=c;
            x--;
        }
        cout<<c<<endl;//输出Fx
    }
    return 0;
}

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

⭐点赞收藏不迷路~

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

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

相关文章

Java毕业设计 基于SpringBoot vue流浪动物救助网站

Java毕业设计 基于SpringBoot vue流浪动物救助网站 SpringBoot 流浪动物救助网站 功能介绍 首页 图片轮播 动物领养/捐赠 留言 论坛 发布帖子 公告信息 商品信息 添加购物车 立即购买 寻宠请求 购物车 注册登录 个人中心 余额充值 收货地址 动物收藏 动物领养审核 商品订单 …

最简洁的Docker环境配置

Docker环境配置 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的 Mac、Linux或Windows操作系统的机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不…

基于Java+SpringBoot+Vue美容院业务管理系统(源码+文档+部署+讲解)

一.系统概述 悦己美容院后台管理系统的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品&#xff0c;体验高科技时代带给人们的方便&#xff0c;同时也能让用户体会到与以往常规产品不同的体验风格。 与安卓&#xff0c;iOS相比…

100道面试必会算法-20-全排列

100道面试必会算法-20-全排列 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&#…

Vue的模块化开发初探

文章目录 Vue的模块化开发初探一 概述二 步骤2.1 下载必须模块2.2 安装Live Server插件2.3 编写代码2.4 运行结果 三 总结四 参考资料 Vue的模块化开发初探 一 概述 Vue是一个渐进式JavaScript框架&#xff0c;可以按需引入部分功能&#xff0c;而不必全量引入整个框架。 二…

20240324-1-集成学习面试题EnsembleLearning

集成学习面试题 1. 什么是集成学习算法&#xff1f; 集成学习算法是一种优化手段或者策略&#xff0c;将多个较弱的模型集成模型组&#xff0c;一般的弱分类器可以是决策树&#xff0c;SVM&#xff0c;KNN等构成。其中的模型可以单独进行训练&#xff0c;并且它们的预测能以某…

python安装(window环境)

1.下载安装文件 首先推荐去官网下载最新版本&#xff0c;但是我这边官网打开很慢&#xff0c;而且下载的时候也很慢&#xff0c;翻墙也不行。所以我最终选择了非官方下载。 官网&#xff1a;Download Python | Python.org 中文官网&#xff1a;Python下载 | Python中文网 官…

牛客周赛39 --- G -- 小红不想做平衡树 -- 题解

小红不想做平衡树&#xff1a; 思路解析&#xff1a; 好数组的定义为 恰好翻转一个区间是得&#xff0c;这个区间变为升序的。 那么就有五种情况&#xff1a; 1.本身数组就升序的&#xff0c; 翻转一个长度为1的区间后&#xff0c;数组仍为升序 2.本身数组就降序的&#xf…

跨框架探索:React Redux 和 Vuex 对比分析快速掌握React Redux

React Redux 和 Vuex 都是前端状态管理库&#xff0c;分别用于 React 和 Vue.js 框架。 它们都提供了一套规范的状态管理机制&#xff0c;帮助开发者更好地组织和管理应用状态。下面是它们的一些异同点&#xff1a; 相同点&#xff1a; 中心化状态管理&#xff1a;两者都提…

环形链表 II - LeetCode 热题 26

大家好&#xff01;我是曾续缘&#x1f61b; 今天是《LeetCode 热题 100》系列 发车第 26 天 链表第 5 题 ❤️点赞 &#x1f44d; 收藏 ⭐再看&#xff0c;养成习惯 环形链表 II 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xf…

docker部署coredns服务器

创建文件夹 mkdir /coredns/config/添加一个CoreDNS配置文件 cat >/coredns/config/Corefile<<EOF.:53 {forward . 114.114.114.114:53log}EOF启动docker docker run -d --name coredns --restartalways \-v /coredns/config:/etc/coredns \-p 53:53/udp \regist…

HarmonyOS 开发-短视频切换实现案例

介绍 短视频切换在应用开发中是一种常见场景&#xff0c;上下滑动可以切换视频&#xff0c;十分方便。本模块基于Swiper组件和Video组件实现短视频切换功能。 效果图预览 使用说明 上下滑动可以切换视频。点击屏幕暂停视频&#xff0c;再次点击继续播放。 实现思路 使用Sw…

一文了解ERC404协议

一、ERC404基础讲解 1、什么是ERC404协议 ERC404协议是一种实验性的、混合的ERC20/ERC721实现的&#xff0c;具有原生流动性和碎片化的协议。即该协议可让NFT像代币一样进行拆分交易。是一个图币的互换协议。具有原生流动性和碎片化的协议。 这意味着通过 ERC404 协议&#xf…

混淆时,编译器优化导致通过反射赋值的类被清空问题

有几个反射赋值的类&#xff0c;之前一直是 keep 整个class的&#xff0c;现在要求对class的路径进行混淆。 当我启用混淆后&#xff0c;发现整个类的内容被清空了。 // 原始的类内容public class BaseLoadData {property("config_data1")public static String dat…

R语言数据可视化:ggplot2绘图系统

ggpolt2绘图系统被称为R语言中最高大上的绘图系统&#xff0c;使用ggplot2绘图系统绘图就像是在使用语法创造句子一样&#xff0c;把数据映射到几何客体的美学属性上。因此使用ggplot2绘图系统的核心函数ggplot来绘图必须具备三个条件&#xff0c;数据data&#xff0c;美学属性…

如何开始用 C++ 写一个光栅化渲染器?

光栅化渲染器是计算机图形学中最基础且广泛应用的一种渲染技术&#xff0c;它将三维模型转化为二维图像。下面我们将逐步介绍如何使用C语言从零开始构建一个简单的光栅化渲染器。 一、理解光栅化渲染原理 光栅化是一种将几何数据&#xff08;如点、线、三角形&#xff09;转换…

视频拍摄后如何用二维码分享?在线制作视频二维码的方法

现在很多人会将拍摄的视频内容用生成二维码的方式来分享给其他人&#xff0c;与以前使用微信、QQ、网盘等形式相比&#xff0c;二维码能够更加简单快捷的将视频传递给其他人查看&#xff0c;不需要下载缓存占用扫码者的内存&#xff0c;提供更好的用户体验效果。 视频转二维码…

大语言模型及提示工程在日志分析任务中的应用 | 顶会IWQoS23 ICPC24论文分享

本文是根据华为技术专家陶仕敏先生在2023 CCF国际AIOps挑战赛决赛暨“大模型时代的AIOps”研讨会闪电论文分享环节上的演讲整理成文。 BigLog&#xff1a;面向统一日志表示的无监督大规模预训练方法 BigLog: Unsupervised Large-scale Pre-training for a Unified Log Represen…

低代码平台适合谁用?业务岗能用它做什么?开发岗能用它做什么?一文讲清!

近期&#xff0c;低代码开发平台以其独特的魅力&#xff0c;迅速引发了大众的广泛关注。众多人士纷纷寻求了解各类低代码产品&#xff0c;以探究其功能与特点。 然而&#xff0c;有些人可能因一两款产品的体验不佳&#xff0c;便对整个低代码行业产生了偏见。但我要指出的是&am…

JS 表单验证

点击注册的时候&#xff0c;渲染出来&#xff0c;验证码是自动获取出来的 html&#xff1a; <div class"div1">用户名<input type"text" id"yhm"><span id"span1"></span><br>密码<input type"…