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