51nod oj 1100 斜率最大

来源:互联网 发布:mysql获取前十条记录 编辑:程序博客网 时间:2024/06/05 00:29

1100 斜率最大
基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题
 收藏
 关注
平面上有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示例
51 26 84 45 42 3
Output示例
4 2

第一次循环时可以记录---

然后比较时先记录可以节约很多时间


代码:

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define LL long longstruct node{LL x,y,hao;}dian[10010];struct nn{int qian,hou;}pp[10010];bool cmp(node xx,node yy){return xx.x<yy.x;}int main(){int n;scanf("%d",&n);LL a,b;for (int i=1;i<=n;i++){scanf("%lld%lld",&a,&b);dian[i-1].hao=i;dian[i-1].x=a;dian[i-1].y=b;}sort(dian,dian+n,cmp);int k=0;LL xx,yy;for (int i=0;i<n-1;i++){for (int j=i+1;j<n;j++){if (dian[i].x==dian[j].y) continue;if (!k){a=i;b=j;pp[k].qian=a;pp[k++].hou=b;}else{xx=(dian[j].y-dian[i].y)*(dian[b].x-dian[a].x);yy=(dian[b].y-dian[a].y)*(dian[j].x-dian[i].x);if (xx>=yy){if (xx==yy){pp[k].qian=a;pp[k++].hou=b;}else{a=i;b=j;k=0;pp[k].qian=a;pp[k++].hou=b;}}}}}for (int i=0;i<k;i++)printf("%d %d\n",dian[pp[i].qian].hao,dian[pp[i].hou].hao);return 0;}


0 0
原创粉丝点击