平面上有N個(gè)點(diǎn),任意2個(gè)點(diǎn)確定一條直線漓滔,求出所有這些直線中,斜率最大的那條直線所通過的兩個(gè)點(diǎn)乖篷。(點(diǎn)的編號(hào)為1-N响驴,如果有多條直線斜率相等,則輸出所有結(jié)果撕蔼,按照點(diǎn)的X軸坐標(biāo)排序豁鲤,正序輸出秽誊。數(shù)據(jù)中所有點(diǎn)的X軸坐標(biāo)均不相等)
Input
第1行,一個(gè)數(shù)N琳骡,N為點(diǎn)的數(shù)量锅论。(2 <= N <= 50)
第2 - N + 1行:具體N個(gè)點(diǎn)的坐標(biāo),X Y均為整數(shù)(-10^9 <= X,Y <= 10^9)
Output
每行2個(gè)數(shù)楣号,中間用空格分隔最易。分別是起點(diǎn)編號(hào)和終點(diǎn)編號(hào)(起點(diǎn)的X軸坐標(biāo)<終點(diǎn)的X軸坐標(biāo))
Input示例
5
1 2
6 8
4 4
5 4
2 3
Output示例
5 4
6 8
解題思想:將這些坐標(biāo)點(diǎn)按橫坐標(biāo)排序,求相鄰兩點(diǎn)的斜率炫狱,找出最大斜率后輸出直線兩點(diǎn)藻懒。
參考代碼(沒有用STL):
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
struct node //存儲(chǔ)點(diǎn)的信息
{
float x,y;
};
int main()
{
int n=0;
while(cin>>n)
{
node nodes[50];
float k[50];
for(int i=0; i<n; i++)
{
cin>>nodes[i].x>>nodes[i].y;
}
for(int i=n; i>0; i--)
{
for(int i=0; i+1<n; i++)
{
if(nodes[i].x>nodes[i+1].x)
{
node temp;
temp=nodes[i];
nodes[i]=nodes[i+1];
nodes[i+1]=temp;
}
}
}
for(int i=0; i+1<n; i++)//求兩點(diǎn)之間斜率
{
if((nodes[i+1].x-nodes[i].x)==0)//除0
{
k[i]=99999;
continue;
}
k[i]=(nodes[i+1].y-nodes[i].y)/(nodes[i+1].x-nodes[i].x);
cout<<k[i]<<endl;
}
float max_a=k[0];
for(int i=0; i<n-1; i++) //找出最大斜率
{
if(max_a<k[i])
{
max_a=k[i];
}
}
for(int i=0; i<n; i++)
{
if(k[i]==max_a)
{
cout<<nodes[i].x<<" "<<nodes[i].y<<endl;//輸出結(jié)點(diǎn)
cout<<nodes[i+1].x<<" "<<nodes[i+1].y<<endl;
}
}
}
return 0;
}