题干:
平面上有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的!!!!不然样例就错了,就全输出。。