博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 P1378 油滴扩展 Label:搜索
阅读量:6480 次
发布时间:2019-06-23

本文共 2464 字,大约阅读时间需要 8 分钟。

 

题目描述

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

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

输入输出格式

输入格式:

 

第1行一个整数N。

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

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

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

 

输出格式:

 

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

 

输入输出样例

输入样例#1:
220 0 10 1013 317 7
输出样例#1:
50

 

 代码

 

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<cstdlib>
#include<cmath>
#define ll long long
#define eps 1e-8
#define INF 0x3f3f3f3f
#define pi 3.141592653589
using 
namespace 
std;
 
struct 
cc{
    
double 
x,y;
}nod[10];
 
double 
d_nod[10][10],d_wall[10];
double 
r[10];
int 
N,S,vis[10];
double 
ans;
 
double 
cal_d(
int 
i,
int 
j){
    
double 
x1=nod[i].x,y1=nod[i].y,x2=nod[j].x,y2=nod[j].y;
    
return 
sqrt
((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
 
double 
cal_s(
double 
r){
    
return 
pi*r*r;
}
 
void 
init_(){
    
double 
x1,x2,y1,y2;
    
scanf
(
"%d"
,&N);
    
scanf
(
"%lf%lf%lf%lf"
,&x1,&y1,&x2,&y2);
    
S=
abs
(x1-x2)*
abs
(y1-y2);
     
    
for
(
int 
i=1;i<=N;i++){
        
scanf
(
"%lf%lf"
,&nod[i].x,&nod[i].y);
    
}
    
for
(
int 
i=1;i<=N;i++){
        
for
(
int 
j=i+1;j<=N;j++){
            
d_nod[i][j]=d_nod[j][i]=cal_d(i,j);
        
}
    
}
    
memset
(d_wall,0x3f,
sizeof
(d_wall));
    
for
(
int 
i=1;i<=N;i++){
        
double 
x=nod[i].x,y=nod[i].y;
        
d_wall[i]=min(
abs
(x-x1),
abs
(x-x2));
        
double 
tmp=min(
abs
(y-y1),
abs
(y-y2));
        
d_wall[i]=min(tmp,d_wall[i]);
    
}
}
 
void 
dfs(
int 
x,
int 
dep){
    
double 
nowr=d_wall[x];
    
for
(
int 
i=1;i<=N;i++){
        
if
(i==x)
continue
;
        
if
(vis[i]) nowr=min(nowr,d_nod[x][i]-r[i]);
    
}
     
    
if
(nowr<0) nowr=0;
    
r[x]=nowr;
     
    
if
(dep==N){
        
double 
sum=0.0;
        
for
(
int 
i=1;i<=N;i++) sum+=cal_s(r[i]);
        
ans=max(ans,sum);
//        for(int i=1;i<=N;i++) cout<<r[i]<<endl;
//        puts("-------------");
        
return
;
    
}
     
    
vis[x]=1;
    
for
(
int 
i=1;i<=N;i++){
        
if
(!vis[i]) dfs(i,dep+1);
    
}
    
r[x]=0;
    
vis[x]=0;
}
 
void 
work(){
    
for
(
int 
i=1;i<=N;i++) dfs(i,1);
    
cout<<(
int
(S-ans+0.5))<<endl;
}
 
int 
main(){
//    freopen("01.in","r",stdin);
     
    
init_();
    
work();
     
    
return 
0;
}

这是我写过的最最最朴素的搜索,没有之一

Line 59 这样写只有60分 nowr=min(nowr,d_nod[x][i]-r[i]); 

 

然后圆周率总得背几位出来吧

给你萌安利一个背数字的好方法,想背啥把啥当作手机密码或者某个账的密码

听3.14159265358979323846

不仅可以锻炼记忆力,还可以让你戒掉手机hhh

 

 

 

转载于:https://www.cnblogs.com/radiumlrb/p/6065857.html

你可能感兴趣的文章
学习iOS【3】数组、词典和集合
查看>>
Hessian 原理分析--转
查看>>
转: 基于netty+ protobuf +spring + hibernate + jgroups开发的游戏服务端
查看>>
easyui传入map的数据前台展示出tree格式数据
查看>>
悲观的思考,乐观的生活.我们既需要思考的深度,也需要生活的温度!
查看>>
java.math.BigDecimal
查看>>
Vitamio中文API文档(4)—— VitamioInstaller
查看>>
yii框架常用url地址
查看>>
python3.4学习笔记(十六) windows下面安装easy_install和pip教程
查看>>
MyGUI 解析
查看>>
Linux中的ls命令详细使用
查看>>
graph-tool文档(一)- 快速开始使用Graph-tool - 2.属性映射、图的IO和Price网络
查看>>
GraphicsLab Project之辉光(Glare,Glow)效果 【转】
查看>>
<转>Python: __init__.py 用法
查看>>
Linux Curl命令
查看>>
-27979 LoadRunner 错误27979 找不到请求表单 Action.c(73): Error -27979: Requested form not found...
查看>>
[LeetCode] Minimum Depth of Binary Tree
查看>>
,net运行框架
查看>>
Java 中 Emoji 的正则表达式
查看>>
Mixin Network第一届开发者大赛作品介绍- dodice, diceos和Fox.one luckycoin
查看>>