51NOD 1100 斜率最大
阿新 • • 發佈:2019-02-19
平面上有N個點,任意2個點確定一條直線,求出所有這些直線中,斜率最大的那條直線所通過的兩個點。
(點的編號為1-N,如果有多條直線斜率相等,則輸出所有結果,按照點的X軸座標排序,正序輸出。資料中所有點的X軸座標均不相等)
Input
第1行,一個數N,N為點的數量。(2 <= N <= 10000)
第2 - N + 1行:具體N個點的座標,X Y均為整數(-10^9 <= X,Y <= 10^9)
Output
每行2個數,中間用空格分隔。分別是起點編號和終點編號(起點的X軸座標 < 終點的X軸座標)
Input示例
5
1 2
6 8
4 4
5 4
2 3
Output示例
4 2
解題思路:
因為要想斜率最大肯定是相鄰的兩個點斜率最大,這個可以畫圖參考,然後我們就對所有點進行排序按照橫座標從小到大排序,如果相同的話,就是縱座標從大到小排,然後再開一個結構體,保留一下橫座標,剩餘的就是一個起始點,一個結束點,也就是相鄰的兩個座標,然後求一下斜率,從大到小排序就行了,這個資料有點水,不需要考慮多個點的情況
My Code:
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int MAXN = 1e4+5;
const double eps = 1e-9;
struct point
{
double x, y;
int rank;
}a[MAXN];
bool cmp1(point a, point b)
{
if(a.x == b.x)
return a.y > b.y;
return a.x < b.x;
}
struct node
{
double x, k;
int s, e;
}b[MAXN];
bool cmp2(node a, node b)
{
if(a.k == b.k)
return a.x < b.x;
return a.k > b.k;
}
int main()
{
int n;
while(cin>>n)
{
for(int i=1; i<=n; i++)
{
cin>>a[i].x>>a[i].y;
a[i].rank = i;
}
sort(a+1, a+1+n, cmp1);
int cnt = 0;
for(int i=2; i<=n; i++)
{
b[cnt].x = a[i-1].x;
b[cnt].s = a[i-1].rank;
b[cnt].e = a[i].rank;
b[cnt].k = (a[i].y-a[i-1].y)/(a[i].x-a[i-1].x);
cnt++;
}
sort(b, b+cnt, cmp2);
cout<<b[0].s<<" "<<b[0].e<<endl;
}
return 0;
}