Logo 贾永菁的博客

博客

D:水彩画 题解

2022-05-09 19:46:33 By 贾永菁

这道题是典型的深搜

不要一听深搜就害怕,这一题只是顺序要深搜

void dfs(int k,double sum)

{

    if(k>n)
{

    ansmax=max(ansmax,sum);

    return;

}

for(int i=1;i<=n;i++)

{

    if(!s[i])

    {

        r[i]=suan(i);

        s[i]=1;

        dfs(k+1,sum+r[i]*r[i]*PI);

        s[i]=0;

    }

}

}

PI指Π(圆周率)

这里只要搜一下顺序就行

其中sum是水彩面积

ansmax就是最大水彩面积

suan这是一个函数,用于计算当前点的面积

suan函数简单粗暴只要判断边界和其他颜色就行了

判断与其他颜色接触只需看他们的最短直线距离就可以了

那么

程序有了

PS:不要直接抄,我加了防抄

include

using namespace std;

double PI=3.1415926535;

bool s[10];

double x[10],y[10],r[10],xa,ya,xb,yb,ansmax;

int n;

double suan(int i)

{

double s1=min(abs(x[i]-xa),abs(x[i]-xb));

double s2=min(abs(y[i]-ya),abs(y[i]-yb));

double ans=min(s1,s2);

for(int j=1;j<=n;j++)

    if(i!=j&&s[j])

    {

        double d=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));

        ans=min(ans,max(d-r[j],0.0));

    }

return ans;

}

void dfs(int k,double sum)

{

if(k>n)

{

    ansmax=max(ansmax,sum);

    return;

}

for(int i=1;i<=n;i++)

    if(!s[i])

    {

        r[i]=suan(i);

        s[i]=1;

        dfs(k+1,sum+r[i]*r[i]*PI);

        s[i]=0;

    }

}

int main()

{

double ss;

cin>>n;

cin>>xa>>ya>>xb>>yb;

ss=abs(xa-xb)*abs(ya-yb); 

for(int i=1;i<=n;i++)

    cin>>x[i]>>y[i];

dfs(1,0);

//cout<<int(ss+0.5-ansmax);

return 0;

}

评论

xushuoxin
你这确定加了防抄吗
xushuoxin
起码这个题解是比较合格的
我是董轩辰
禁止泄露AC代码!!!
快乐的熊果
@mike

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。