abc139F

半眼秒了
显然随机就能过

#include <bits/stdc++.h>

#include <random>
using namespace std;
typedef double db;
int n;
db x[105],y[105];int id[105];
db abs(db x,db y){return sqrt(x*x+y*y);}
db sa(){
    shuffle(id+1,id+1+n, std::mt19937(std::random_device()()));
    db a=0,b=0;
    for(int i=1;i<=n;i++){
        if(abs(a+x[id[i]],b+y[id[i]])>=abs(a,b))a+=x[id[i]],b+=y[id[i]];
    }
    return abs(a,b);
}
int main(){
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++)cin>>x[i]>>y[i],id[i]=i;
    db ans=0;
    for(int i=1;i<=100000;i++)
        ans = max(ans,sa());
    printf("%.17f\n",ans);
}

下面考虑正解
我们要选的一堆向量,肯定要在某个夹角范围内选,并且这个范围内的所有向量是都要选的,
极角排序然后枚举起点就行。
叉积排序会wa???不懂。
直接用atan2反而能过。
代码不粘了600多行板子不太好

猜你喜欢

转载自www.cnblogs.com/MXang/p/11596955.html