题干:

平面上有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轴坐标)

Sample Input

5
1 2
6 8
4 4
5 4
2 3

Sample Output

4 2

解题报告:

      贪心排序。

AC代码:

#include<bits/stdc++.h>

using namespace std;
const double eps = 1e-8;
const int MAX = 10000 + 5; 
struct Point {
	int x,y;
	int id;
} p[MAX];
struct Node {
	int id1,id2;
	double k;
	Node(){}
	Node(int id1,int id2,double k):id1(id1),id2(id2),k(k){}

} node[MAX];
bool cmp(const Point &a ,const Point &b) {
	return a.x<b.x;
}
bool cmp2(const Node a,const Node b) {
	return a.k>b.k;
}
int main()
{
	int n;
	double kk;
	cin>>n;
	for(int i = 1; i<=n; i++) {
		scanf("%d%d",&p[i].x,&p[i].y);
		p[i].id = i;
	}
	sort(p+1,p+n+1,cmp);
	for(int i = 1; i<=n-1; i++) {
		kk = (p[i+1].y-p[i].y)*1.0/(p[i+1].x-p[i].x);
//		node[i] = Node(p[i].id,p[i+1].id,kk);
		Node tmp;node[i].id1 = p[i].id;node[i].id2 = p[i+1].id; node[i].k = kk; 
	}
	sort(node+1,node+n,cmp2);
//	for(int i = 1; i<=n-1; i++)
//	cout<< node[i].k<<endl;
	double maxx = node[1].k;
	for(int i = 1; i<=n-1; i++) {
		if( abs(node[i].k - maxx) <= eps) {
			printf("%d %d\n",node[i].id1,node[i].id2);
		}
		else break;
	}
	return 0 ;
 } 

总结:

   最后那个判断要加abs的!!!!不然样例就错了,就全输出。。