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; }