Fork me on GitHub

P1378 油滴扩展

https://www.luogu.org/problem/show?pid=1378
思路简单的搜索题。
但是!这题真的是让我挠心啊!
请看注释的那两行,为什么!!(表示被这样坑了一天)

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm> 
#include<cmath>
#define PI 3.1415926
#define PP(x) (x)*(x)
using namespace std;
int n,X0,Y0,X1,Y1;
struct H{
    int x,y;
    double r;
}p[10];
bool f[10];
double ans=0,s=0,dis[10][10];
double minx(double a,double b,double c,double d)
{
    double k;
    k=min(a,b);k=min(k,c);
    k=min(k,d);return k;
}
bool check()
{
    for(int i=1;i<=n;i++)
      if(!f[i]) return 0;
    return 1;
}
void dfs()
{
    if(check()){ans=max(ans,s);return;}

    double R=1e20;
    for(int i=1;i<=n;i++)
    if(!f[i])
    {   
        //R=min(R,min((double)abs(p[i].x-X1),(double)abs(p[i].x-X0)));
        //R=min(R,min((double)abs(p[i].y-Y1),(double)abs(p[i].y-Y0)));为什么是错的!!!!! 
        R=minx(abs(p[i].x-X1),abs(p[i].x-X0),abs(p[i].y-Y1),abs(p[i].y-Y0));

        for(int j=1;j<=n;j++) if(j!=i&&f[j])
        R=min(R,dis[i][j]-p[j].r); 
        if(R<0) R=0.0;

        f[i]=1;p[i].r=R;s+=R*R;
        dfs();
        f[i]=0;p[i].r=0;s-=R*R;
    }
}
int main()
{
    scanf("%d",&n);
    scanf("%d%d%d%d",&X0,&Y0,&X1,&Y1);

    for(int i=1;i<=n;i++) scanf("%d%d",&p[i].x,&p[i].y),p[i].r=0;

    for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)
    dis[i][j]=sqrt(PP(p[i].x-p[j].x)+PP(p[i].y-p[j].y));

    dfs();

    double S=(double)abs(X0-X1)*abs(Y0-Y1);
    ans=S-ans*PI;
    printf("%d",(int)(ans+0.5));
    return 0;
} 
posted @ 2017-09-24 17:48  primes  阅读(187)  评论(0编辑  收藏  举报