uva 10012 How Big Is It?

本文介绍了一种解决圆排列问题的方法,通过递归地放置每个圆并计算它们的横坐标来寻找最小矩形长度。使用C++实现了解决方案,并详细解释了核心函数及其工作原理。

点击打开链接 (这个链接到BNUOJ上面是一样的)


题目意思: 给定m个圆的半径,现在要求找到一个矩形使得每一个球都以地面相切,要求输出最小的矩阵的长度


解题思路: 最小的圆排列问题,对于这样的一个图形我么是转化为坐标来计算,那么我们需要做的三个步骤就是 1 递归去放入每一个圆 2 求出每一个圆的圆心的横坐标 3计算最小的长度 。 具体过程见代码分析:


代码:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;

int n , m;
double r[10];//用来存储每一个圆的半径
double p[10];//存储圆的横坐标
double ans;

//求解第k个圆的横坐标函数(也就是说,第k个圆很可能跟前面任何一个圆相切。这时,只要把各种情况得到取值全部算出,并把最大值 记录下来)
//我们知道对于从左往右的所有的圆来说,圆心的横坐标都是增大,不用考虑圆的大小,那么对于k这个圆,它是最右边的那么我们找到最大的横坐标才是它的横坐标值
double Point(int k){
    double R = 0;
    for(int j = 1 ; j < k ; j++){
        double tempr = p[j] + 2.0*sqrt(r[k]*r[j]);//两个圆的距离 d = sqrt((r1+r2)^2 - (r1-r2)^2) 那么有 d  =  2.0*sqrt(r[k]*r[j]);    
        if(R < tempr)//更新为最大
            R = tempr;
    }
    return R;
}

//计算当前的圆排列的长度
//p[i]-r[i],就是该圆最左边的切线的横坐标   p[i]+r[i]就是该圆最右边的切线的横坐标,那么对于这个圆排列的长度就是最右边的横坐标减去最左边的横坐标
void Distance(){
    double high , low;
    high = 0 ; low = 0;
    for(int i = 1 ; i <= m ; i++){
        if(p[i]-r[i] < low)  low  = p[i] - r[i];     //更新最左边的位置
        if(p[i]+r[i] > high) high = p[i] + r[i]; //更新最右边的位置
    }
    if(high - low < ans)
        ans = high - low;//更新最小距离
}

//回溯搜索函数
void dfs(int k){
    if(k > m)//圆放完后就是计算这个排列的长度
        Distance();
    else{
        for(int j = k ; j <= m ; j++){
            swap(r[k] , r[j]);//考虑放入k后,序列长度; 还要考虑继第k个球之后,余下的m-k个球放入后,对整个序列的长度的影响.
            double R = Point(k);
            if(R+r[k]+r[1] < ans){//满足条件继续递归
                p[k] = R;
                dfs(k+1);
            }
            swap(r[k] , r[j]);//现场的恢复
        }
    }
}

//主函数
int main(){
    scanf("%d" , &n);
    while(n--){
        scanf("%d" , &m);
        memset(r , 0.0 , sizeof(r));
        memset(p , 0.0 , sizeof(p));
        for(int i = 1 ; i <= m ; i++)
            scanf("%lf" , &r[i]);
        p[1] = 0.0;//规定第一个点的横坐标为0
        ans = 999999999;
        dfs(1);
        printf("%.3lf\n" , ans);//输出的格式
    }
    return 0;
}


【无人机】基于改进粒子群算法的无人机路径规划研究[和遗传算法、粒子群算法进行比较](Matlab代码实现)内容概要:本文围绕基于改进粒子群算法的无人机路径规划展开研究,重点探讨了在复杂环境中利用改进粒子群算法(PSO)实现无人机三维路径规划的方法,并将其与遗传算法(GA)、标准粒子群算法等传统优化算法进行对比分析。研究内容涵盖路径规划的多目标优化、避障策略、航路点约束以及算法收敛性和寻优能力的评估,所有实验均通过Matlab代码实现,提供了完整的仿真验证流程。文章还提到了多种智能优化算法在无人机路径规划中的应用比较,突出了改进PSO在收敛速度和全局寻优方面的优势。; 适合人群:具备一定Matlab编程基础和优化算法知识的研究生、科研人员及从事无人机路径规划、智能优化算法研究的相关技术人员。; 使用场景及目标:①用于无人机在复杂地形或动态环境下的三维路径规划仿真研究;②比较不同智能优化算法(如PSO、GA、蚁群算法、RRT等)在路径规划中的性能差异;③为多目标优化问题提供算法选型和改进思路。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注算法的参数设置、适应度函数设计及路径约束处理方式,同时可参考文中提到的多种算法对比思路,拓展到其他智能优化算法的研究与改进中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值