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 }