zoukankan      html  css  js  c++  java
  • P1378油滴扩展(搜索)

    做笔记。

    给你一个长方形,和长方形里面的一些点,每个点可以放置一个油滴,油滴可以扩展,知道遇到边界或者其他的油滴才会停止扩展,要你选择最合适的顺序放置油滴使得剩下的区域最小。

    要求输出剩下的最小的面积

    其实就是一个深搜的题目(或者是求全排列),搜出所有情况,然后取最大的面积就好了

    #include<cmath>
    #include<iostream>
    #define PI 3.14159265358
    using namespace std;
    const int N=10;
    double xa,ya,xb,yb;
    int n;
    double x[N],y[N];
    double r[N];
    bool vis[N];
    double res=0;
    double cal(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&&vis[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))//如果此时的油滴已经在某个油滴扩展区域的内部了,通过max将其pass掉
            }
        }
        return ans;
    }
    void dfs(int now,double sum)//常规搜索
    {
        if(now>n)
        {
            res=max(res,sum);
            return;
        }
        for(int i=1;i<=n;i++)
        {
            if(!vis[i])
            {
                vis[i]=true;
                r[i]=cal(i);
                dfs(now+1,sum+PI*r[i]*r[i]);
                vis[i]=false;
            }
        }
    }
    int main(void)
    {
        cin>>n;
        cin>>xa>>ya>>xb>>yb;
        int s=abs(xa-xb)*abs(ya-yb);
        for(int i=1;i<=n;i++)
            cin>>x[i]>>y[i];
        dfs(1,0);
        cout<<int(s-res+0.5);
        return 0;
    }
  • 相关阅读:
    BZOJ 5018 [Snoi2017]英雄联盟
    BZOJ 4945 [Noi2017]游戏
    BZOJ4942 [Noi2017]整数
    BZOJ 2427 [HAOI2010]软件安装
    BZOJ 4870 [Shoi2017]组合数问题
    THINKPHP 全局404
    PHP 万能查询代码
    xml Array 相互转化
    JS 倒计时计算
    PHP 多态
  • 原文地址:https://www.cnblogs.com/greenofyu/p/12006343.html
Copyright © 2011-2022 走看看