1. 程式人生 > >51NOD 1100 斜率最大

51NOD 1100 斜率最大

傳送門

平面上有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; }