zoukankan      html  css  js  c++  java
  • LUOGU P1378 油滴扩展

    题目描述

    在一个长方形框子里,最多有N(0≤N≤6)个相异的点,在其中任何一个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界。必须等一个油滴扩展完毕才能放置下一个油滴。那么应该按照怎样的顺序在这N个点上放置油滴,才能使放置完毕后所有油滴占据的总体积最大呢?(不同的油滴不会相互融合)

    注:圆的面积公式V=pi*r*r,其中r为圆的半径。
    输入输出格式
    输入格式:

    第1行一个整数N。

    第2行为长方形边框一个顶点及其对角顶点的坐标,x,y,x’,y’。

    接下去N行,每行两个整数xi,yi,表示盒子的N个点的坐标。

    以上所有的数据都在[-1000,1000]内。

    输出格式:

    一行,一个整数,长方形盒子剩余的最小空间(结果四舍五入输出)

    输入输出样例
    输入样例#1:

    2
    20 0 10 10
    13 3
    17 7

    输出样例#1:

    50

    解题思路

    搜索,全排列油滴扩展顺序,每次算出半径,注意算半径还要与0取max,避免负数。

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<cstdlib>
    
    using namespace std;
    const int MAXN = 10;
    
    int n,x,y,xz,yz;
    int sx[MAXN],sy[MAXN];
    double r[MAXN],ans,pi=3.141592653589793238,dis[MAXN][MAXN];
    bool vis[MAXN];
    
    inline double Min(int cur){
        double k=min(abs(x-sx[cur]),abs(y-sy[cur]));
        k=min(k,(double)min(abs(xz-sx[cur]),abs(yz-sy[cur])));
        for(register int i=1;i<=n;i++){
            if(!vis[i] || i==cur) continue;
            k=min(dis[cur][i]-r[i],k);
        }
        k=max(k,0.0);
        return k;
    }
    
    void dfs(int tot,double now){
        if(tot==n+1) {ans=max(ans,now);return;} 
        for(register int i=1;i<=n;i++){
            if(vis[i]) continue;
            vis[i]=1;
            r[i]=Min(i);
            dfs(tot+1,now+r[i]*r[i]*pi);
            r[i]=0;
            vis[i]=0;
        }
    }
    
    int main(){
        scanf("%d%d%d%d%d",&n,&x,&y,&xz,&yz);
        for(register int i=1;i<=n;i++) scanf("%d%d",&sx[i],&sy[i]);
        for(register int i=1;i<=n;i++)
            for(register int j=i+1;j<=n;j++)
                dis[i][j]=dis[j][i]=sqrt((sx[i]-sx[j])*(sx[i]-sx[j])+(sy[i]-sy[j])*(sy[i]-sy[j]));
    //  cout<<(double)abs(x-xz)*abs(y-yz)<<endl;
        dfs(1,0.0);ans=(double)abs(x-xz)*abs(y-yz)-ans;
        printf("%.0lf",ans);
        return 0;
    }
  • 相关阅读:
    集成TBS(腾讯浏览服务)x5内核的webView
    android studio 华为手机看不到具体的错误日志
    android混淆那些事
    通用工具
    用队列来处理订单以及集合间性能比较
    从.Net版本演变看String和StringBuilder性能之争
    从事件来看委托
    从矢量来看运算符重载
    从foreach语句枚举元素看数组
    从装箱拆箱看泛型
  • 原文地址:https://www.cnblogs.com/sdfzsyq/p/9676869.html
Copyright © 2011-2022 走看看