【51nod 1100】斜率最大
2017-06-24 07:05
405 查看
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
证明最优解一定是在相邻两个点之间。
然后顺便感慨一下,隔壁O(n2)的暴力居然过了……目瞪口呆。
#include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; struct node{int x,y,num;}a[10010]; int n,cnt,t=2,ans[10010]; double lv=-2e9; bool cmp(node a,node b){return a.x<b.x;} int comp(double i,double j) { if(fabs(i-j)<1e-6)return 0; if(i>j)return 1; return -1; } double xl(int i,int j){return (double)(a[j].y-a[i].y)/(a[j].x-a[i].x);} int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d%d",&a[i].x,&a[i].y); a[i].num=i; } sort(a+1,a+n+1,cmp); while(t<=n) { double f=xl(t-1,t); if(comp(f,lv)>0){lv=f;cnt=0;ans[++cnt]=t-1;ans[++cnt]=t;} else if(comp(f,lv)==0)ans[++cnt]=t; t++; while(t<=n&&comp(xl(t-2,t-1),xl(t-1,t))>0)t++; } for(int i=1;i<=cnt;i++)printf("%d ",a[ans[i]].num); return 0; }View Code
相关文章推荐
- 51nod 1100 斜率最大
- 51Nod 1100 斜率最大
- 51nod 1100:斜率最大
- 51Nod 1100 斜率最大
- 51nod 1100 斜率最大
- 51nod 1100 斜率最大
- 51nod 1100 斜率最大
- 51nod_1100_斜率最大
- 51NOD 1100 斜率最大
- 51nod 1100 斜率最大
- 51nod-1100 斜率最大
- 51Nod-1100-斜率最大
- 51Nod-1100 斜率最大
- 51nod oj 1100 斜率最大
- 51Nod 斜率最大(拉勾专业算法能力测评)
- 51Nod-斜率最大
- 51Nod 斜率最大
- 1100 斜率最大(找规律)
- 51Nod 斜率最大
- 【51NOD】斜率最大