[洛谷P1378]油滴扩展

本文介绍了一种解决圆覆盖问题的算法,通过排列组合的方法找到最优解,确保每个点都被覆盖的同时最小化总面积。

题目←

题面里讲述的题意很明白
一开始wa掉到的点:1、有的点会在没扩展前就被覆盖掉;
2、x,y都要取min(zz错误)

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int MAXN = 200 + 50;
struct zt{
    double x,y;
}node[MAXN << 1];
int n;
double len[MAXN][MAXN];
double R[MAXN];
double x,y,X,Y,xx,yy;
double tot;
double ans,now,r;
int temp[MAXN];
void solve(){
    now = 0;
    for(int i = 1;i <= n;i ++){
        xx = node[temp[i]].x;
        yy = node[temp[i]].y;
        r = 1061109567.0;
        for(int j = 1;j < i;j ++){
            if(R[temp[j]] >= len[temp[i]][temp[j]]){
                r = 0;
                continue;
            }
            r = min(r,len[temp[i]][temp[j]] - R[temp[j]]);
        }
        r = min(r,abs(x - xx));
        r = min(r,abs(X - xx));
        r = min(r,abs(Y - yy));
        r = min(r,abs(yy - y));
        R[temp[i]] = r;
        now += r*r*M_PI;
    }
    ans = max(ans,now);
}
int main(){
    scanf("%d",&n);
    scanf("%lf%lf%lf%lf",&x,&y,&X,&Y);
    tot = abs(x - X)*abs(y - Y);
    for(int i = 1;i <= n;i ++){
        scanf("%lf%lf",&node[i].x,&node[i].y);
    }
    for(int i = 1;i <= n;i ++){
        for(int j = 1;j < i;j ++){
            len[i][j] = sqrt((node[i].x - node[j].x)*(node[i].x - node[j].x) + 
                (node[i].y - node[j].y)*(node[i].y - node[j].y));
            len[j][i] = len[i][j];
        }
    }
    for(int i = 1;i <= n;i ++)temp[i] = i;
    do{
        solve();
    }while(next_permutation(temp + 1,temp + n + 1));
    printf("%.lf",tot - ans);
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值