题目大意: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\n",sqrt(ans));
    return 0;
}
01-07 23:39