算法训练 Balloons in a Box (枚举,模拟)
接下来是模拟的方案。假设你已知一个长方体的盒子和一个点集。每一个点代表一个可以放置气球的位置。在一个点上放置一个气球,就是以这个点为球心,然后让这个球膨胀,直到触及盒子的边缘或者一个之前已经被放置好的气球。你不能使用一个在盒子外面或者在一个之前已经放置好的气球里面的点。但是,你可以按你喜欢的任意顺序使用这些点,而且你不需要每个点都用。你的目标是按照某种顺序在盒子里放置气球,使得气球占据的总体积最大。
你要做的是计算盒子里没被气球占据的体积。
0 0 0
10 10 10
3 3 3
7 7 7
对于20%的数据:n=1
对于50%的数据:1≤n≤3
对于100%的数据:1≤n≤6
这道题主要学习了几何模拟方面的知识
另外还学习了STL库中的next-permutation函数
这个函数主要是求全排列用的
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring> using namespace std;
const int maxn = ;
const double inf = 0x7ffffff;
const double pi = acos(-1.0); struct point
{
double x,y,z;
double r;
}a[maxn], s, e; //s和e是关于长方体的两个对点,a[]是关于长方体内的气球的位置
int n;
double ans;
double dis(point p1, point p2)
{
double tmp1 = (p1.x - p2.x)*(p1.x - p2.x);
double tmp2 = (p1.y - p2.y)*(p1.y - p2.y);
double tmp3 = (p1.z - p2.z)*(p1.z - p2.z);
return sqrt(tmp1+tmp2+tmp3);
} double solve(int i) //球心位置到长方体侧面的最短距离
{
double t1 = min(fabs(a[i].x - e.x), fabs(a[i].x - s.x));
double t2 = min(fabs(a[i].y - e.y), fabs(a[i].y - s.y));
double t3 = min(fabs(a[i].z - e.z), fabs(a[i].z - s.z));
double r = min(t1, t2);
r = min(r, t3);
return r;
} double area(double r) //求的面积
{
return 4.0*r*r*r*pi/3.0;
} int main()
{
while(~scanf("%d", &n))
{
scanf("%lf %lf %lf", &s.x, &s.y, &s.z);
scanf("%lf %lf %lf", &e.x, &e.y, &e.z);
double total = fabs((s.x - e.x)*(s.y - e.y)*(s.z - e.z));
memset(a, , sizeof(a));
for(int i = ; i < n; i++)
scanf("%lf %lf %lf", &a[i].x, &a[i].y, &a[i].z);
double ans = ;
int vis[maxn];
for(int i = ; i < n; i++)
vis[i] = i; do
{
for(int i = ; i < n; i++)
a[i].r = ;
double tmp = ;
for(int i = ; i < n; i++)
{
a[vis[i]].r = solve(vis[i]);
for(int j = ; j < n; j++)
{
if(i == j || a[vis[j]].r == )
continue;
double tt = dis(a[vis[j]], a[vis[i]]) - a[vis[j]].r;
tt = max(tt, 0.0);
a[vis[i]].r = min(a[vis[i]].r, tt);
}
tmp += area(a[vis[i]].r);
}
ans = max(ans, tmp);
}while(next_permutation(vis, vis+n)); //求出关于各个圆心位置的全排列
printf("%.0f\n", fabs(total-ans)); //关于next_permutation:http://bbs.csdn.net/topics/392058688
}
return ;
}
算法训练 Balloons in a Box (枚举,模拟)的更多相关文章
- Java实现 蓝桥杯 算法训练 Balloons in a Box
试题 算法训练 Balloons in a Box 问题描述 你要写一个程序,使得能够模拟在长方体的盒子里放置球形的气球. 接下来是模拟的方案.假设你已知一个长方体的盒子和一个点集.每一个点代表一个可 ...
- ALGO-115_蓝桥杯_算法训练_和为T(枚举)
问题描述 从一个大小为n的整数集中选取一些元素,使得它们的和等于给定的值T.每个元素限选一次,不能一个都不选. 输入格式 第一行一个正整数n,表示整数集内元素的个数. 第二行n个整数,用空格隔开. 第 ...
- C语言 · 数字三角形 · 算法训练
问题描述 (图3.1-1)示出了一个数字三角形. 请编一个程序计算从顶至底的某处的一条路 径,使该路径所经过的数字的总和最大. ●每一步可沿左斜线向下或右斜线向下走: ●1<三角形行数≤100: ...
- 算法训练 K好数
算法训练 K好数 时间限制:1.0s 内存限制:256.0MB 问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数 ...
- 蓝桥杯 算法训练 ALGO-146 4-2找公倍数
算法训练 4-2找公倍数 时间限制:1.0s 内存限制:256.0MB 查看参考代码 问题描述 这里写问题描述. 打印出1-1000所有11和17的公倍数. 样例输入 一个满足题 ...
- Java实现 蓝桥杯 算法训练 审美课
算法训练 审美课 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 <审美的历程>课上有n位学生,帅老师展示了m幅画,其中有些是梵高的作品,另外的都出自五岁小朋友之手.老师 ...
- Java实现 蓝桥杯 算法训练 字串统计
算法训练 字串统计 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最 ...
- Java实现 蓝桥杯 算法训练 最大的算式
算法训练 最大的算式 时间限制:1.0s 内存限制:256.0MB 问题描述 题目很简单,给出N个数字,不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量大.因为 ...
- Java实现蓝桥杯VIP算法训练 纪念品分组
试题 算法训练 纪念品分组 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得的纪念品价值 相对均衡, ...
随机推荐
- linux php相关命令
学习源头:http://www.cnblogs.com/myjavawork/articles/1869205.html php -m 查看php开启的相关模块 php -v 查看php的版本 运行直 ...
- Asp.NET Core+ABP框架+IdentityServer4+MySQL+Ext JS之验证码
验证码这东西,有人喜欢有人不喜欢.对于WebApi是否需要验证码,没去研究过,只是原来的SimpleCMS有,就加上吧. 在WeiApi上使用验证码,关键的地方在于WeiApi是没有状态的,也就是说, ...
- JSP/java 执行创建批处理文件,并执行批处理事务。
protected void doGet(HttpServletRequest req, HttpServletResponse resp) { InputStream in = null; Inpu ...
- Js基础之函数
定义函数:我们使用function标签来定义函数 使用函数:JavaScript函数定义完毕是不能自动执行的,需要我们调用或者事件触发,比如点击事件,鼠标事件,键盘事件等. 下面我们以点击事件为例,调 ...
- 【转】Inter-eNB S1 切换
本博客介绍Inter-eNB的S1切换的流程 当eNB收到测量报告,或是因为内部负荷分担等原因,触发了切换判决,进行eNB间小区间通过S1口的切换. 源eNB通过S1接口的 HANDOVER REQU ...
- 2015.3.3 VC6调用dll
用VC新建一对话框工程,在一按钮点击事件中添加如下代码: typedef void (WINAPI * TESTDLL)(); HINSTANCE hmod; hmod = ::LoadLibrary ...
- Ubuntu16.04 Hadoop2.6.0伪分布式安装与启动中遇到的问题
1.安装JDK1.8,下载安装包解压至 /usr/lib/jdk vim /etc/profile #配置路径 export JAVA_HOME= /usr/lib/jdk export JRE_HO ...
- NodeJS之Url的使用
一.通过http模块中的request事件可以得到在服务端拿到客户端的有关url的数据(req.url),其中req.url得到的数据是端口号后的所有路径,之后通过调入url模块对获取到的req.ur ...
- oracle connect by用法篇 (包括树遍历)之二
3.2查询当前时间往前的12周的开始时间.结束时间.第多少周 , ) - (rownum ) as startDate, sysdate , 'd'))) - (rownum ) as endDate ...
- DAY11-MYSQL补充之SQL逻辑查询语句执行顺序
一 SELECT语句关键字的定义顺序 SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOI ...