题目大意:n个点,任意几个点组合后得到的点距离原点的最远距离。
题解:极角排序:https://blog.csdn.net/qq_39942341/article/details/79840394
利用极角排序,将这些点看成与原点相作用的向量,然后根据平行四边行法则,两向量之间的角度相差越小,其复合得到的向量的长度越长。
#include<bits/stdc++.h> using namespace std; const int N=1E5+7; struct stu{ double a,b; bool friend operator <(const stu &x,const stu &y){ return atan2(x.b,x.a)<atan2(y.b,y.a); } }arr[N]; int nxt[N]; int main(){ int n; cin>>n; for(int i=1;i<=n;i++) cin>>arr[i].a>>arr[i].b; for(int i=1;i<=n;i++) nxt[i]=i+1; nxt[n]=1; sort(arr+1,arr+1+n); double ans=0; for(int i=1;i<=n;i++){//以每个点为起始点,遍历一圈后回到起始点,同时记录大小 double dx=arr[i].a; double dy=arr[i].b; ans=max(ans,arr[i].a*arr[i].a+arr[i].b*arr[i].b); for(int j=nxt[i];j!=i;j=nxt[j]){ dx+=arr[j].a; dy+=arr[j].b; ans=max(ans,dx*dx+dy*dy); } } printf("%.15lf ",sqrt(ans)); return 0; }