首页 > 其他分享 >最小距离和

最小距离和

时间:2023-05-31 15:03:54浏览次数:38  
标签:rr Point int double 凸函数 最小 距离 include


题目:在一个平面坐标系中给定

最小距离和_ios

最小距离和_i++_02

个点,坐标为范围的绝对值均在

最小距离和_ios_03

范围内,在

最小距离和_#include_04

轴上找一点

     使得这点到所有点的距离之和最短。

 

分析:本题方法是三分,我们知道三分满足的条件是这个对象必须是单峰函数。题目要求找到最小值,那么也就是说

     这个距离之和是一个下凸函数,现在来开始证明。


     设要找的点的坐标为

最小距离和_ios_05

,那么设距离之和的函数为

最小距离和_#include_06

,那么得到


     

最小距离和_i++_07


 

     继续设

最小距离和_i++_08

,对

最小距离和_#include_09

求二阶导得到


     

最小距离和_ios_10

      

     在高数中我们学过下面的定理:



     定理:

最小距离和_#include_06

在区间

最小距离和_ios_12

上有二阶导数,如果

最小距离和_#include_13

,则

最小距离和_i++_14


最小距离和_#include_15

上的下凸函数,否则如果

最小距离和_ios_16

,          则

最小距离和_i++_17


最小距离和_#include_15

上的上凸函数。


     那么得到


    

最小距离和_ios_19


     也就是说

最小距离和_i++_20

为凸函数,也就是单峰函数,那么对于凸函数求最值我们利用三分即可。



代码:

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <math.h>

using namespace std;
const int N = 100005;
const double eps = 1e-8;

struct Point
{
    double x,y;
};

Point p[N];

double dist(Point A,Point B)
{
    return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));
}

double sum(Point p[],int n,double x)
{
    Point t;
    t.x = x;
    t.y = 0;
    double ans = 0;
    for(int i=0;i<n;i++)
        ans += dist(p[i],t);
    return ans;
}

double Search(Point p[],int n)
{
    double l = -1e6;
    double r = 1e6;
    while(r - l > eps)
    {
        double ll = (2 * l + r) / 3;
        double rr = (l + 2 * r) / 3;
        double ans1 = sum(p,n,ll);
        double ans2 = sum(p,n,rr);
        if(ans1 > ans2) l = ll;
        else r = rr;
    }
    return l;
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
            scanf("%lf%lf",&p[i].x,&p[i].y);
        printf("%.6lf\n",Search(p,n));
    }
    return 0;
}

 

 


标签:rr,Point,int,double,凸函数,最小,距离,include
From: https://blog.51cto.com/u_16146153/6386924

相关文章

  • 椭圆中心到椭圆切线的距离
    本文将要讨论的是椭圆中心到椭圆切线的距离公式,在求这个距离之前,我们首先要知道两个定理。定理1:椭圆          上的点到椭圆左,右焦点的距离分别是和,其中是椭圆的离心率。定理2:椭圆(1)上的点处的切线方程是     实际上这两个定理都是很容易证明的,这是高中所学的知识......
  • 1439. 有序矩阵中的第 k 个最小数组和
    给你一个m *n的矩阵mat,以及一个整数k,矩阵中的每一行都以非递减的顺序排列。你可以从每一行中选出1个元素形成一个数组。返回所有可能数组中的第k个最小数组和。来源:力扣(LeetCode)链接:https://leetcode.cn/problems/find-the-kth-smallest-sum-of-a-matrix-with-so......
  • 最小编译器和 UI 框架「GitHub 热点速览」
    如果有一个关键词来概述本周的GitHub热门项目的话,大概就是van和sectorc都用到的smallest。只不过一个是前端的响应式框架,一个是搞编译的C编译器。它们除了轻量化这个共同特点之外,还有好用,足以满足你的日常编程所需。说到编程,EasySpider便是一个免去敲代码工作量,用看得......
  • 最小割的可行边与必须边
    最近做了一道神奇的题,涉及了一些奇怪的知识,了解了一下补:比较绕人,部分可以多读几遍已知割集是指在网络流的一张图上,删去割集里的边后使原点与汇点不连通,并且这些边构成最小割,显然一张网络流图上有多个割集,这时就有\(2\)个概念去区分存在于这些割集中的边:1.可行边:指存......
  • Matlab中的偏最小二乘法(PLS)回归模型,离群点检测和变量选择|附代码数据
    全文下载:http://tecdat.cn/?p=22319最近我们被客户要求撰写关于偏最小二乘法(PLS)回归的研究报告,包括一些图形和统计输出。本文建立偏最小二乘法(PLS)回归(PLSR)模型,以及预测性能评估。为了建立一个可靠的模型,我们还实现了一些常用的离群点检测和变量选择方法,可以去除潜在的离群点和只......
  • python spark 求解最大 最小 平均 中位数
    rating_data_raw=sc.textFile("%s/ml-100k/u.data"%PATH)printrating_data_raw.first()num_ratings=rating_data_raw.count()print"Ratings:%d"%num_ratings#In[35]:rating_data=rating_data_raw.map(lambdaline:line.split(&quo......
  • sql 求最小依赖集
    步骤1.右切,箭头右边只留一个字母2.除本身求闭包,假设去掉某个条件BCD->A(中的A),利用B,C,D在剩下的条件中求闭包,即求(BCD)+F=??    若闭包中不含有A,则保留这个条件;含有A即能推出(不需要BCD->A),删掉这个条件3.左部最小化,即尽可能压缩左边,例BCD->A,如看看BC能否推D,若能,改原条件......
  • leetcode 2712. 使所有字符相等的最小成本
    2712.使所有字符相等的最小成本给你一个下标从 0 开始、长度为 n 的二进制字符串 s ,你可以对其执行两种操作:选中一个下标 i 并且反转从下标 0 到下标 i(包括下标 0 和下标 i )的所有字符,成本为 i+1 。选中一个下标 i 并且反转从下标 i 到下标 n-......
  • 最小生成树_LuoguP1669
    P1669P1669[USACO04DEC]BadCowtractorsS题目传送门题意简化:在一个有\(N\)个点\(M\)条边的图中选出\(N-1\)条边构成一棵树,使得树的总边权最大,求最大总边权。上述问题即为最小(大)生成树问题,本题为最大生成树,如有未详者可以移步P3366。该问题一般是Kruskal和Prim......
  • 代码随想录算法训练营第二十一天|530. 二叉搜索树的最小绝对差、
    【参考链接】530.二叉搜索树的最小绝对差【注意】1.二叉搜索树采用中序遍历,其实就是一个有序数组。2.使用双指针,更快。【代码】1#Definitionforabinarytreenode.2#classTreeNode(object):3#def__init__(self,val=0,left=None,right=None):4#......