[2018.10.17 T1] 斜率

本文介绍了一种求解平面内多个点间最大斜率的高效算法。通过将点按x轴排序,计算并比较相邻点间的斜率,快速找到最大斜率。适用于计算机科学中的几何问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

暂无链接

斜率

【题目描述】

给定平面上nnn个点的坐标,求所有经过这些点中至少两个点的直线的最大斜率。

【输入格式】

第一行一个整数nnn,表示点的个数。
接下来nnn行,每行两个正整数x,yx,yx,y,描述每个点的坐标。

【输出格式】

一行一个实数表示答案,保留小数点后333位。

【样例 1】
slope. in

3
1 2
2 3
3 4

slope.out

1.000

【样例 2】

见选手目录下 slope. in/slope.ans

【数据范围与约定】

对于20%20\%20%的数据,n&lt;=10n&lt;=10n<=10
对于50%50\%50%的数据,n&lt;=103n&lt;=10^3n<=103
对于100%100\%100%的数据,n&lt;=5∗105n&lt;=5*10^5n<=5105,坐标&lt;=107&lt;=10^7<=107,没有两点横坐标相同。

题解

发现对于一个角朝下的三角形,上面的那条边斜率一定小于旁边两条边,所以直接将所有点按xxx轴排序,算相邻两点的斜率取maxmaxmax即可。

代码
#include<bits/stdc++.h>
using namespace std;
const int M=5e5+5;
struct sd{double x,y;}pt[M];
double ans=-1e7;
int n,i;
bool operator<(sd a,sd b){return a.x<b.x;}
void in(){scanf("%d",&n);for(i=1;i<=n;++i)scanf("%lf%lf",&pt[i].x,&pt[i].y);}
void ac(){for(sort(pt+1,pt+1+n),i=2;i<=n;++i)ans=max(ans,(pt[i].y-pt[i-1].y)/(pt[i].x-pt[i-1].x));printf("%.3lf",ans);}
int main(){in(),ac();}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShadyPi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值