洛谷 1429 平面最近点对 贪心? 解题报告

题目描述

给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的

输入输出格式

输入格式:

第一行:n;2≤n≤200000

接下来n行:每行两个实数:x y,表示一个点的行坐标和列坐标,中间用一个空格隔开。

输出格式:

仅一行,一个实数,表示最短距离,精确到小数点后面4位。

输入输出样例

输入样例#1: 复制

3
1 1
1 2
2 2

输出样例#1:

1.0000

说明

0<=x,y<=10^9

思路

我贪心的??
排序x与y然后暴力找
数据水???

代码

#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=200000+5;
const int inf=0x3f3f3f3f;
int n;
double ans=inf;
struct data
{
    int x,y;
}point[N];
double cal(int x1,int y1,int x2,int y2)
{return sqrt(pow((double)(x1-x2),2)+pow((double)(y1-y2),2));}
inline bool cmp1(data a,data b)
{return a.x<b.x;}
inline bool cmp2(data a,data b)
{return a.y<b.y;}
int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++) 
    scanf("%d%d",&point[i].x,&point[i].y);
    sort(point+1,point+n+1,cmp1);
    for (int i=1;i<n;i++)
    ans=min(ans,cal(point[i].x,point[i].y,point[i+1].x,point[i+1].y));
    sort(point+1,point+n+1,cmp2);
    for (int i=1;i<n;i++)
    ans=min(ans,cal(point[i].x,point[i].y,point[i+1].x,point[i+1].y));
    printf("%.4lf",ans);
    return 0;
}
贪心法和动态规划是两种常见的求解优化问题的算法。它们有一些共同和差异。 共同: - 都可以用于求解优化问题,即在满足一定约束条件下,寻找最优解。 - 都可以通过将问题分解为子问题来求解。 - 都可以使用递归或迭代的方式进行求解。 差异: - 贪心法是一种局部最优策略,每一步都选择当前最优解,最终得到的解不一定是全局最优解。而动态规划则是通过保存子问题的解,通过推导得到最优解,可以获得全局最优解。 - 贪心法通常比动态规划更简单快速,因为它不需要保存所有的子问题的解,只需要根据当前情况做出最优选择即可。而动态规划需要保存所有的子问题的解,以便后续使用。 - 贪心法的求解过程是自上而下的,每一步都做出当前最优选择。而动态规划的求解过程是自下而上的,先求解子问题,再根据子问题的解推导出更大规模问题的解。 范例: 贪心法和动态规划的共同是它们都可以用于求解优化问题,都可以通过将问题分解为子问题来求解,都可以使用递归或迭代的方式进行求解。 贪心法和动态规划的差异在于贪心法是一种局部最优策略,每一步都选择当前最优解,最终得到的解不一定是全局最优解。而动态规划则是通过保存子问题的解,通过推导得到最优解,可以获得全局最优解。 贪心法通常比动态规划更简单快速,因为它不需要保存所有的子问题的解,只需要根据当前情况做出最优选择即可。而动态规划需要保存所有的子问题的解,以便后续使用。 贪心法的求解过程是自上而下的,每一步都做出当前最优选择。而动态规划的求解过程是自下而上的,先求解子问题,再根据子问题的解推导出更大规模问题的解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值