51nodeE 斜率最大

题目传送门

这道题只要证明最佳解一定在相邻两个点之间的好啦 这个自己证一证就okay啦

而且我发现n方的算法可以过耶...

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int M=10007;
int read(){
    int ans=0,f=1,c=getchar();
    while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();}
    while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();}
    return ans*f;
}
double get(int x1,int y1,int x2,int y2){return 1.0*(y2-y1)/(x2-x1);}
int n,top=1,q[M],x[M],sum;
double mx,w;
struct node{int x,y,pos;}e[M];
bool cmp(node a,node b){return a.x!=b.x?a.x<b.x:a.y<b.y;}
int main()
{
    n=read();
    for(int i=1;i<=n;i++) e[i].x=read(),e[i].y=read(),e[i].pos=i;
    sort(e+1,e+1+n,cmp);
    while(top<n){
        if((w=get(e[top].x,e[top].y,e[top+1].x,e[top+1].y))>mx) mx=w,sum=2,x[1]=e[top].pos,x[2]=e[top+1].pos;
        else if(w==mx) sum++,x[sum]=e[top].pos,sum++,x[sum]=e[top+1].pos;
        top++;
    }
    for(int i=1;i<=sum;i+=2) printf("%d %d\n",x[i],x[i+1]);
    return 0;
}
View Code

 

posted @ 2017-06-19 21:47  友人Aqwq  阅读(188)  评论(0编辑  收藏  举报