51nod 1100 斜率最大

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


这题数据水,可以暴力过,不过最优解是nlogn 斜率最大的一定是相邻的两个点。
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N = 1e4+10;
 4 struct Point{
 5     int x, y;
 6     int id;
 7 }p[N];
 8 struct Nod{
 9     double k;
10     int id1, id2;
11 }nod[N];
12 bool cmp1(Point &a, Point &b) {
13     return a.x < b.x;
14 }
15 bool cmp2(Nod &a, Nod &b) {
16     return a.k > b.k;
17 }
18 int main() {
19     int n;
20     cin >> n;
21     for(int i = 0; i < n; i ++) {
22         cin >> p[i].x >> p[i].y;
23         p[i].id = i+1;
24     }
25     sort(p,p+n,cmp1);
26     for(int i = 0; i < n-1; i ++) {
27         nod[i].k = (p[i+1].y-p[i].y)/(p[i+1].x-p[i].x);
28         nod[i].id1 = p[i].id;
29         nod[i].id2 = p[i+1].id;
30     }
31     sort(nod,nod+n-1,cmp2);
32     cout << nod[0].id1 << ' ' << nod[0].id2 << endl;
33     return 0;
34 }

猜你喜欢

转载自www.cnblogs.com/xingkongyihao/p/8934093.html