ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P1378 油滴扩展

2021-09-27 13:35:39  阅读:98  来源: 互联网

标签:min P1378 double 扩展 ++ int path 油滴 minv


暴力出全排列然后求出这种放油的顺序得到的覆盖面积,求所有覆盖面积的最大值,实际做的时候ans保存的是所有半径的平方的和的最大值。

在放一个油滴A的时候,需要和之前放下的油滴B一一比较,如果A和B的距离小于B的半径,那么放不了,否则可能的半径为\(r(A)=dist(A, B)-r(B)\),和所有点比较后,取最小的r(A),然后还需要用r(A)和A离矩形边框四周的距离取一遍最小,这样就得到了真正的r(A)

另外这题的PI的精确度会影响结果,开始用的3.14, 后来改用系统宏M_PI过了

#include<iostream>
#include<cmath>

using namespace std;

const int N = 10;

#define PII pair<int, int>
#define x first
#define y second

int n;
int down_, up_, left_, right_;
PII p[N];
double r[N]; // 半径
int path[N];
double ans;
int st[N];


double dist(PII a, PII b){
    double dx = a.x - b.x;
    double dy = a.y - b.y;
    return sqrt(dx * dx + dy * dy);
}

void dfs(int u){
    if(u == n){
        for(int i = 0; i < n; i ++){
            double minv = 1e9;
            for(int j = 0; j < i; j ++){
                double d = dist(p[path[i]], p[path[j]]);
                if(d < r[path[j]]){
                    minv = 0;
                    break;
                }
                minv = min(minv, d - r[path[j]]);
            }
            minv = min(minv, fabs(p[path[i]].x - left_));
            minv = min(minv, fabs(p[path[i]].x - right_));
            minv = min(minv, fabs(p[path[i]].y - up_));
            minv = min(minv, fabs(p[path[i]].y - down_));
            r[path[i]] = minv;
        }
        double maxv = 0;
        for(int i = 0; i < n; i ++) maxv = maxv + r[i] * r[i];
        ans = max(ans, maxv);
        return;
    }
    
    for(int i = 0; i < n; i ++){
        if(st[i] == 0){
            st[i] = 1;
            path[u] = i;
            dfs(u + 1);
            st[i] = 0;
        }
    }
}

int main(){
    cin >> n;
    int a, b, c, d;
    cin >> a >> b >> c >> d;
    
    left_ = min(a, c);
    right_ = max(a, c);
    up_ = max(b, d);
    down_ = min(b, d);
    

    for(int i = 0; i < n; i ++)
        cin >> p[i].x >> p[i].y;
        
    dfs(0);
    
    printf("%.0lf", (up_ - down_) * (right_ - left_) - M_PI * ans);
    
    return 0;
}

标签:min,P1378,double,扩展,++,int,path,油滴,minv
来源: https://www.cnblogs.com/tomori/p/15342504.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有