Description

平面上有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示例

5
1 2
6 8
4 4
5 4
2 3

Output示例

4 2

Solution

  • 贪心:先按这 NN 个点按 xx 排序,找相邻两个比较即可。

  • 为什么呢?假设三个点排序后顺序是ABC,那么有两种情况:

    1. ABC共线,则 k(AB)=k(BC)=k(AC)k(AB)=k(BC)=k(AC) ;

    2. ABC不共线,则ABC将形成一个三角形,那么 k(AC)<Max(k(AB),k(BC))k(AC) 。

  • 说明跨点的一定不会比相邻的更优,贪心地找是正确的。时间复杂度 O(N log N)O(N\ log\ N) 。

  • 统计答案时也是,用链表存着共线的点,

  • 新加入一个点,如果也共线,就从链表中逐个匹配,再将自己也加入链表中。

Code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N=10001;
typedef pair<int,int> PI;
int num;
int next[N],rk[N];
PI a[N],f[N];
double ans=-1e9;
inline int read()
{int X=0,w=1; char ch=0;while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();return X*w;
}
inline double get(int x,int y)
{return (a[x].second-a[y].second)*1.0/(a[x].first-a[y].first);
}
inline bool cmp(int x,int y)
{return a[x].first<a[y].first;
}
int main()
{int n=read();for(int i=1;i<=n;i++) a[rk[i]=i].first=read(),a[i].second=read();sort(rk+1,rk+1+n,cmp);for(int i=1;i<n;i++){double x=get(rk[i],rk[i+1]);if(x>ans){ans=x;f[num=1]=make_pair(rk[i],rk[i+1]);memset(next,0,sizeof(next));next[rk[i+1]]=rk[i];}elseif(x==ans){for(int j=next[rk[i]];j;j=next[j])f[++num]=make_pair(j,rk[i+1]);}}for(int i=1;i<=num;i++)if(a[f[i].first].first>a[f[i].second].first) swap(f[i].first,f[i].second);for(int i=1;i<=num;i++) printf("%d %d\n",f[i].first,f[i].second);return 0;
}

51Nod 斜率最大相关推荐

  1. 斜率小于0的连线数量 51Nod - 1107 (树状数组+离散化)

    二维平面上N个点之间共有C(n,2)条连线.求这C(n,2)条线中斜率小于0的线的数量. 二维平面上的一个点,根据对应的X Y坐标可以表示为(X,Y).例如:(2,3) (3,4) (1,5) (4, ...

  2. 51nod 1451 合法三角形 判斜率去重,时间复杂度O(n^2)

    题目: 这题我WA了3次,那3次是用向量求角度去重算的,不知道错在哪了,不得不换思路. 第4次用斜率去重一次就过了. 注意:n定义成long long,不然求C(3,n)时会溢出. 代码: #incl ...

  3. 51nod 1100:斜率最大

    题目链接 斜率最大点对横坐标必相邻 #include <bits/stdc++.h> using namespace std; const int maxn = 1e4 + 100;str ...

  4. 【CodeForces - 602D】Lipshitz Sequence(思维,单调栈,斜率单调性)

    题干: A function  is called Lipschitz continuous if there is a real constant Ksuch that the inequality ...

  5. 51nod《拉勾专业算法能力测评》测试有感

    昨天在逛博客的过程中,发现一个有趣的网站,也就是51nod,在那里有很多算法马拉松,网站看起来也不错,至于题目的难度也是有一点的. 在逛的过程中,就发现了这个比赛,就点进去看了看. 看到图片的介绍就想 ...

  6. BZOJ1597: [Usaco2008 Mar]土地购买(dp 斜率优化)

    题意 题目链接 Sol 重新看了一遍斜率优化,感觉又有了一些新的认识. 首先把土地按照\((w, h)\)排序,用单调栈处理出每个位置第向左第一个比他大的位置,显然这中间的元素是没用的 设\(f[i] ...

  7. 51nod 1617 奇偶数组

    传送门 回来看一眼51nod,发现自己掉到rank4了,赶紧切道题回rank3. 一眼不会做,这种东西应该慢慢找规律吧--然后看到数据范围其实比较小,应该是单次log的,那是不是可以分治啊. #inc ...

  8. BZOJ 1597: [Usaco2008 Mar]土地购买( dp + 斜率优化 )

    既然每块都要买, 那么一块土地被另一块包含就可以不考虑. 先按长排序, 去掉不考虑的土地, 剩下的土地长x递增, 宽y递减 dp(v) = min{ dp(p)+xv*yp+1 } 假设dp(v)由i ...

  9. opencv判断 线夹角_opencv计算直线的斜率、截距,与水平线弧度值、角度值

    opencv计算直线的斜率.截距,与水平线弧度值.角度值 发布时间:2018-07-10 12:56, 浏览次数:1324 , 标签: opencv 1.输入一堆直线,返回每条直线的斜率和截距 斜率和 ...

最新文章

  1. vim 成“神“之路 (一)
  2. freescale imx6 编译 linux ltib,TQIMX6Q技术分享——LTIB安装配置(转)
  3. 屠榜大杀器UniMP!百度登顶图神经网络权威榜单三项榜首
  4. 又见GCD (已知最大公约数和其中一个数求另一个数)
  5. websocket vs keep-live
  6. 异构图-GTN(Graph Transformer Networks)
  7. strcat在某种特定条件下的优化
  8. java 获取当前年_java中的反射(三) - kelexin
  9. 数据库 SQL Server2012安装步骤详解
  10. 电子病历系统中痕迹保留的应用意义
  11. 《刷新》读书笔记1-3章
  12. 瑞萨开发记录01:点亮一颗LED灯(R5F104FEA芯片)
  13. 如何去除搜索引擎上的广告
  14. Windows API 编程起始——创建一个窗口
  15. 顺丰 android 面试题,经典的顺丰面试问题
  16. Bootstrap项目之微金所
  17. Python之闭包与装饰器
  18. Overcoming Language Priors in VQA via Decomposed Linguistic Representations阅读笔记
  19. 湖泊富营养化TSI评价
  20. 【VUE3+AntV X6】 引入ANTV X6 的流程图编辑器应用(一)

热门文章

  1. python中%符号详解
  2. 安装模块时提示Collecting package metadata (repodata.json): failed
  3. windows2012自动锁定计算机,如何在Windows中启用或禁用自动锁定
  4. [云炬创业学笔记]第二章决定成为创业者测试9
  5. 2020教资高频考点作文素材汇总
  6. [MATLAB粒子模拟笔记]粒子坐标速度初始化
  7. 划重点!十分钟掌握牛顿法凸优化
  8. github使用ssh key
  9. markdown一边写一边预览_如何用Markdown轻松排版知乎专栏文章?
  10. OpenGL编程指南4:双缓冲实现运行