平面上有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
关键是推出在题目条件下 最大的斜率肯定是存在于相邻的两个点之间 然后就容易做了
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <queue> #include <vector> #include <iomanip> #include <math.h> #include <map> using namespace std; #define FIN freopen("input.txt","r",stdin); #define FOUT freopen("output.txt","w",stdout); #define INF 0x3f3f3f3f #define INFLL 0x3f3f3f3f3f3f3f #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 typedef long long LL; typedef pair<int, int> PII; const int maxn = 10000 + 5; struct node { int x, y; int num; } a[maxn]; int cmp(node aa, node bb) { return aa.x < bb.x; } int ans1[maxn]; int ans2[maxn]; int main() { //FIN int n; scanf("%d", &n); for(int i = 1; i <= n; i++) { scanf("%d%d", &a[i].x, &a[i].y); a[i].num = i; } sort(a + 1, a + 1 + n, cmp); double mx = -INF; int x = 0, y = 0; int cas = 0; for(int i = 1; i < n; i++) { double p = (double)(a[i].y - a[i+1].y) / (a[i].x - a[i+1].x); if(p > mx) { cas = 0; ans1[cas] = a[i].num, ans2[cas] = a[i+1].num; mx = p; cas++; } else if(p == mx) { ans1[cas] = a[i].num, ans2[cas] = a[i+1].num; mx = p; cas++; } } for(int i = 0; i < cas; i++) { //if(a[ans1[i]].x > a[ans2[i]].x) swap(ans1[i], ans2[i]); printf("%d %d ", ans1[i], ans2[i]); } return 0; }