您的位置:首页 > 其它

51Nod 1100 斜率最大

2016-12-11 22:30 218 查看
平面上有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 <stdio.h>
#include <algorithm>
#define MAXN 10009
using namespace std;

struct point
{
double x, y;
int rank;
}a[MAXN];

bool cmp1(point a, point b)
{
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(scanf("%d",&n)!= EOF)
{
for(int i=1; i<=n; i++)
{
scanf("%lf%lf",&a[i].x,&a[i].y);
a[i].rank = i;
}
sort(a+1, a+1+n, cmp1);
int cnt = 0;
double maxk = -2*1000000000;
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);
if (b[cnt].k > maxk)
maxk = b[cnt].k;
cnt++;
}
sort(b, b+cnt, cmp2);
for(int i = 0; i < cnt; i++)
{
if(b[i].k == maxk)
printf("%d %d\n",b[i].s,b[i].e);
if(b[i].k < maxk)
break;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: