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

news2024/11/25 11:42:04

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

时间限制: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;
}

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

⭐点赞收藏不迷路~

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

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

相关文章

基于SSM+Jsp+Mysql的高校毕业设计管理系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

【三十六】【算法分析与设计】综合练习(3),39. 组合总和,784. 字母大小写全排列,526. 优美的排列

目录 39. 组合总和 对每一个位置进行枚举 枚举每一个数出现的次数 784. 字母大小写全排列 526. 优美的排列 结尾 39. 组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不…

【信贷后台管理之(五)】

文章目录 目录结构一、面包屑组件封装二、退出登录接口联调三、申请列表的菜单路由3.1 路由创建&#xff0c;表格编写3.2 列表接口调用3.3 出生日期转变3.4 申请状态3.5 申请列表的操作3.5.1 编辑删除提交操作3.5.2 禁用状态3.5.3 操作接口3.5.4 搜索查询3.5.5 申请列表分页功能…

Leetcode面试经典150_Q14最长公共前缀

题目&#xff1a; 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀&#xff0c;返回空字符串 ""。 思路A&#xff1a;横向/纵向扫描 Python&#xff1a; class Solution:def longestCommonPrefix(self, strs: List[str]) -> str:s "…

NPDP含金量高吗?什么人适合学习NPDP?

省流版&#xff1a;NPDP含金量挺高的&#xff0c;做产品的建议去学习下~ 一、什么是NPDP&#xff1f; NPDP 是产品经理国际资格认证&#xff0c;美国产品开发与管理协会&#xff08;PDMA&#xff09;发起的&#xff0c;是目前国际公认的唯一的新产品开发专业认证&#xff0c;…

LeetCode-279. 完全平方数【广度优先搜索 数学 动态规划】

LeetCode-279. 完全平方数【广度优先搜索 数学 动态规划】 题目描述&#xff1a;解题思路一&#xff1a;Python 动态规划五部曲&#xff08;完全平方数就是物品&#xff08;可以无限件使用&#xff09;&#xff0c;凑个正整数n就是背包&#xff0c;问凑满这个背包最少有多少物品…

小明的衣服-蓝桥1228-优先队列

解法 用优先队列&#xff0c;思路参考哈夫曼树&#xff08;贪心&#xff09; 思路&#xff1a;很复杂&#xff0c;说结果 n件同色衣服要染成都不同色&#xff0c;求邮费最少&#xff1b; 倒过来想&#xff1a;n件不同颜色衣服&#xff0c;要染成同一种颜色&#xff0c;求邮费…

tensorflow.js 使用 opencv.js 将人脸特征点网格绘制与姿态估计线绘制结合起来,以获得更高的帧数

系列文章目录 如何在前端项目中使用opencv.js | opencv.js入门如何使用tensorflow.js实现面部特征点检测tensorflow.js 如何从 public 路径加载人脸特征点检测模型tensorflow.js 如何使用opencv.js通过面部特征点估算脸部姿态并绘制示意图 文章目录 系列文章目录前言一、实现步…

Python高级

不定长参数 位置不定长参数&#xff0c;获取参数args会整合为一个元组 def info(*args):print(arg is, args)print(type(arg) is, type(args))info(1, 2, 3, 4, a, b)# 输出 # arg is (1, 2, 3, 4, a, b) # type(arg) is <class tuple> 关键字不定长参数&#xff0c;&…

JavaSE:图书管理系统

目录 一、前言 二、内容需求 三、类的设计 &#xff08;一&#xff09;图书类 1.Book 类 2.BookList 类 &#xff08;二&#xff09;操作类 1.添加图书AddOperation类 2.借阅图书BorrowOperation类 3.删除图书DelOperation类 4.显示图书ShowOperation类 5.退出系统Ex…

Python代码识别minist手写数字【附pdf】

一、概述 对于人类而言,要识别图片中的数字是一件很容易的事情,但是,如何让机器学会理解图片上的数字,这似乎并不容易。那么,能否找出一个函数(模型),通过输入相关的信息,最终得到期望的结果呢? 二、python代码实现中涉及的输入输出内容: 输入:mnist数据集每一个…

HarmonyOS 开发-手写绘制及保存图片

介绍 本示例使用drawing库的Pen和Path结合NodeContainer组件实现手写绘制功能&#xff0c;并通过image库的packToFile和packing接口将手写板的绘制内容保存为图片。 效果图预览 使用说明 在虚线区域手写绘制&#xff0c;点击撤销按钮撤销前一笔绘制&#xff0c;点击重置按钮…

动态路由-基于vue-admin-template

基于 vue-admin-template的动态路由 1. 拆分静态路由与动态路由 静态路由----所有人都可以访问—首页/登录/404 动态路由–有权限的人才可以访问—组织/角色/员工/权限 2. 根据用户权限添加动态路由 获取对应的权限标识(vuex中actions中把用户资料通过return 进行返回&…

代码随想录算法训练营DAY17|C++二叉树Part.4|110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和

文章目录 110.平衡二叉树思路伪代码CPP代码 257.二叉树的所有路径思路伪代码实现CPP代码 404.左叶子之和思路伪代码CPP代码 110.平衡二叉树 力扣题目链接 文章讲解&#xff1a;110.平衡二叉树 视频讲解&#xff1a;后序遍历求高度&#xff0c;高度判断是否平衡 | LeetCode&…

CSS导读 (复合选择器)

&#xff08;大家好&#xff0c;今天我们将继续来学习CSS的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; 目录 二、CSS的复合选择器 2.1 什么是复合选择器 2.2 后代选择器(重要) 2.3 子选择器(重要) Questions 小提…

七年老测试整理的RF框架大全,一看就会,一学就懂

1.RF框架 全称robot framework,一个基于python开发的&#xff0c;自动化测试框架&#xff0c;这个框架可以做&#xff1a;web自动化&#xff0c;接口自动化&#xff0c;APP自动化。 github官网 1&#xff09;.安装python 检查python环境 python -V或 pip -V 2&#xff09;.…

【linux基础】bash脚本的学习:定义变量及引用变量、统计目标目录下所有文件行数、列数

假设目的&#xff1a;统计并输出指定文件夹下所有文件行数 单个文件可以用 wc -l &#xff1b;多个文件&#xff0c;可以用通配符 / 借助bash脚本 1.定义变量名&#xff0c;使用引号 a"bestqc.com.map" b"Anno.variant_function" c"enrichment/GOe…

UE4_导入内容_Alembic文件导入器

Alembic文件导入器 Alembic文件格式(.abc)是一个开放的计算机图形交换框架&#xff0c;它将复杂的动画化场景浓缩成一组非过程式的、与应用程序无关的烘焙几何结果。虚幻引擎4(UE4)允许你通过 Alembic导入器 导入你的Alembic文件&#xff0c;这让你可以在外部自由地创建复杂的…

android支付宝接入流程

接入前准备 接入APP支付能力前&#xff0c;开发者需要完成以下前置步骤。 本文档展示了如何从零开始&#xff0c;使用支付宝开放平台服务端 SDK 快速接入App支付产品&#xff0c;完成与支付宝对接的部分。 第一步&#xff1a;创建应用并获取APPID 要在您的应用中接入支付宝…

Hot100【十一】:编辑距离

// 定义dp[i][j]: 表示word1前i个字符转换到word2前j个字符最小操作数 // 初始化dp[m1][n1] class Solution {public int minDistance(String word1, String word2) {int m word1.length();int n word2.length();// 1. dp数组int[][] dp new int[m 1][n 1];// 2. dp数组初…