平面上N个点,每两个点都确定一条直线,求出斜率最大的那条直线所通过的两个点

平面上N个点,没两个点都确定一条直线,求出斜率最大的那条直线所通过的两个点(斜率不存在的情况不考虑)。

先把N个点按x排序。
斜率k最大值为max(斜率(point[i],point[i+1])) 1 <=i < n-1。
复杂度Nlog(N)。

下面的例子是求斜率绝对值最大的直线,正常情况下把代码中的绝对值去掉就好了

#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define inf 0x3f3f3f3f
#define pll pair<ll,ll>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define rep1(i,a,b) for(int i=a;i>=b;i--)
#define rson rt<<1|1,m+1,r
#define lson rt<<1,l,m
using namespace std;
const int N=1e5+100;
int arr[N],n,pp;
double mx;
struct node
{
  double x,y;
  friend bool operator <(node a,node b)
  {
      return a.x<b.x||a.x==b.x&&a.y<b.y;
  }
}points[N];
int GetMaxSlope()
{
    double fCurSlope = 0;
    double fMaxSlope = 0;
    for (int k=2;k<=n;k++)
    {
        double a=abs(points[k-1].x - points[k].x);
        fCurSlope = abs(points[k-1].y - points[k].y) / a;
        if (fMaxSlope < fCurSlope)
        {
            fMaxSlope = fCurSlope;
        }
    }
    mx=fMaxSlope;
    return 0;
}
int main()
{
    #ifdef LOCAL_DEFINE
        freopen("D:\\rush.txt","r",stdin);
    #endif
    //ios::sync_with_stdio(false),cin.tie(0);
    int t;
    cin>>t;
    while(t--)
    {
        cin>>n;
        pp=0;
        rep(i,1,n)
        {
            scanf("%lf%lf",&points[i].x,&points[i].y);
        }
        sort(points+1,points+1+n);
        rep(i,1,n-1)
        {
            if(points[i].x==points[i+1].x)
            {
                //cout<<-1<<endl;
                pp=1;
                break;
            }
        }
        if(pp)
            cout<<-1<<endl;
        else
        {
            GetMaxSlope();
            cout<<fixed<<setprecision(8)<<mx<<endl;
        }
    }
}

原文链接: https://www.cnblogs.com/ffgcc/p/10546397.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    平面上N个点,每两个点都确定一条直线,求出斜率最大的那条直线所通过的两个点

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/274313

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月15日 上午12:13
下一篇 2023年2月15日 上午12:14

相关推荐