平面上有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
一个点,两个坐标,为了把这俩信息捆绑起来,我用了结构体,又因为她最后输出是要输出序号,我有在结构体里加了一个顺序进去,这个题呢,还需要会结构体排序,结构体排序定义一个规则就好了。斜率最大必定是这俩点横坐标相邻的情况下。这点我搜其他答案都说是画图就能得到的规律。我一时间想不出来证明,就先用了。如果不这样,复杂度就是n的平方,比较大。容易T。其他的都没什么了。附代码;
#include<cstdio>
#include<algorithm>
using namespace std;
typedef struct{
int a;
int b;
int c;
}num;
double f(int x1,int y1,int x2,int y2)
{
return ((y2-y1)*1.0/(x2-x1));
}
bool cmp(num a,num b)
{
return a.a <b.a ;
}
int main()
{
int n, m, i, j;
num a[10005];
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d %d",&a[i].a,&a[i].b);
a[i].c=i;
}
sort(a,a+n,cmp);
double temp=-0x3f3f3f3f3f;
for(i=0;i<n-1;i++)
{
double sum=f(a[i].a,a[i].b ,a[i+1].a,a[i+1].b);
if(sum>temp)
{
temp=sum;
}
}
for(i=0;i<n-1;i++)
{
double sum=f(a[i].a,a[i].b ,a[i+1].a,a[i+1].b);
if(sum==temp)
printf("%d %d\n",a[i].c+1,a[i+1].c+1);
}
return 0;
}