[LG1378] 油滴扩展

Posted sshwy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LG1378] 油滴扩展相关的知识,希望对你有一定的参考价值。

暴力枚举油滴的编号的排列(next_permutation),然后按序一个一个扩展。面积的求最小值即可。也可以深搜。

复杂度 \(O(n!\times n^2)\).

#include<cstdio>
#include<algorithm>
#include<cmath>
#define sq(a) ((a)*(a))
#define PI 3.1415926535897932626
using namespace std;
int n,l,r,u,d;//rtg
int x[10],y[10];//point
int p[10];//permutation
double ra[10];// 半径
double dis[10][10];//distance
double ans;

int main()
    scanf("%d",&n);
    scanf("%d%d%d%d",&l,&u,&r,&d);
    if(l>r)l^=r^=l^=r;//l<=r
    if(u>d)u^=d^=u^=d;//u<=d
    for(int i=1;i<=n;i++)
        scanf("%d%d",&x[i],&y[i]);
        for(int j=1;j<i;j++)
            dis[i][j]=dis[j][i]=sqrt(sq(x[i]-x[j])+sq(y[i]-y[j]));
        
    

    for(int i=1;i<=n;i++)p[i]=i;
    dofor(int i=1;i<=n;i++)ra[i]=1e9;//init
        for(int i=1;i<=n;i++)//p[i]
            ra[i]=min(ra[i],(double)x[p[i]]-l);
            ra[i]=min(ra[i],(double)r-x[p[i]]);
            ra[i]=min(ra[i],(double)y[p[i]]-u);
            ra[i]=min(ra[i],(double)d-y[p[i]]);
            for(int j=1;j<i;j++)
                ra[i]=min(ra[i],(double)dis[p[i]][p[j]]-ra[j]);
            
            ra[i]=max(ra[i],(double)0);// 如果为负数
        
        double s=0;
        for(int i=1;i<=n;i++)s+=sq(ra[i])*PI;
        ans=max(ans,s);
    while(next_permutation(p+1,p+n+1));
    ans=(r-l)*(d-u)-ans;
    printf("%d",(int)ans+1-(ans-(int)ans<0.5));
    return 0;

以上是关于[LG1378] 油滴扩展的主要内容,如果未能解决你的问题,请参考以下文章

洛谷 P1378 油滴扩展 改错

1378 油滴扩展

[洛谷P1378]油滴扩展

P1378 油滴扩展

题解 P1378 油滴扩展

洛谷P1378 油滴扩展