1. 程式人生 > >[2018.10.17 T1] 斜率

[2018.10.17 T1] 斜率

暫無連結

斜率

【題目描述】

給定平面上 n n 個點的座標,求所有經過這些點中至少兩個點的直線的最大斜率。

【輸入格式】

第一行一個整數 n n ,表示點的個數。
接下來 n

n 行,每行兩個正整數 x , y x,y ,描述每個點的座標。

【輸出格式】

一行一個實數表示答案,保留小數點後 3

3 位。

【樣例 1】
slope. in

3
1 2
2 3
3 4

slope.out

1.000

【樣例 2】

見選手目錄下 slope. in/slope.ans

【資料範圍與約定】

對於 20 % 20\% 的資料, n

< = 10 n<=10
對於 50 % 50\% 的資料, n < = 1 0 3 n<=10^3
對於 100 % 100\% 的資料, n < = 5 1 0 5 n<=5*10^5 ,座標 < = 1 0 7 <=10^7 ,沒有兩點橫座標相同。

題解

發現對於一個角朝下的三角形,上面的那條邊斜率一定小於旁邊兩條邊,所以直接將所有點按 x x 軸排序,算相鄰兩點的斜率取 m a x max 即可。

程式碼
#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();}