问题描述
  你要写一个程序,使得能够模拟在长方体的盒子里放置球形的气球。
  接下来是模拟的方案。假设你已知一个长方体的盒子和一个点集。每一个点代表一个可以放置气球的位置。在一个点上放置一个气球,就是以这个点为球心,然后让这个球膨胀,直到触及盒子的边缘或者一个之前已经被放置好的气球。你不能使用一个在盒子外面或者在一个之前已经放置好的气球里面的点。但是,你可以按你喜欢的任意顺序使用这些点,而且你不需要每个点都用。你的目标是按照某种顺序在盒子里放置气球,使得气球占据的总体积最大。
  你要做的是计算盒子里没被气球占据的体积。
输入格式
  第一行包含一个整数n表示集合里点的个数(1≤n≤6)。第二行包含三个整数表示盒子的一个角落的(x,y,z)坐标,第三行包含与之相对的那个角落的(x,y,z)坐标。接下来n行,每行包含三个整数,表示集合中每个点的(x,y,z)坐标。这个盒子的每维的长度都是非零的,而且它的边与坐标轴平行。
输出格式
  只有一行,为那个盒子没被气球占据的最小体积(四舍五入到整数)。
样例输入
2
0 0 0
10 10 10
3 3 3
7 7 7
样例输出
774
数据规模和约定
  所有坐标的绝对值小于等于1000
  对于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 (枚举,模拟)的更多相关文章

  1. Java实现 蓝桥杯 算法训练 Balloons in a Box

    试题 算法训练 Balloons in a Box 问题描述 你要写一个程序,使得能够模拟在长方体的盒子里放置球形的气球. 接下来是模拟的方案.假设你已知一个长方体的盒子和一个点集.每一个点代表一个可 ...

  2. ALGO-115_蓝桥杯_算法训练_和为T(枚举)

    问题描述 从一个大小为n的整数集中选取一些元素,使得它们的和等于给定的值T.每个元素限选一次,不能一个都不选. 输入格式 第一行一个正整数n,表示整数集内元素的个数. 第二行n个整数,用空格隔开. 第 ...

  3. C语言 · 数字三角形 · 算法训练

    问题描述 (图3.1-1)示出了一个数字三角形. 请编一个程序计算从顶至底的某处的一条路 径,使该路径所经过的数字的总和最大. ●每一步可沿左斜线向下或右斜线向下走: ●1<三角形行数≤100: ...

  4. 算法训练 K好数

      算法训练 K好数   时间限制:1.0s   内存限制:256.0MB 问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数 ...

  5. 蓝桥杯 算法训练 ALGO-146 4-2找公倍数

    算法训练 4-2找公倍数   时间限制:1.0s   内存限制:256.0MB        查看参考代码 问题描述 这里写问题描述. 打印出1-1000所有11和17的公倍数. 样例输入 一个满足题 ...

  6. Java实现 蓝桥杯 算法训练 审美课

    算法训练 审美课 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 <审美的历程>课上有n位学生,帅老师展示了m幅画,其中有些是梵高的作品,另外的都出自五岁小朋友之手.老师 ...

  7. Java实现 蓝桥杯 算法训练 字串统计

    算法训练 字串统计 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最 ...

  8. Java实现 蓝桥杯 算法训练 最大的算式

    算法训练 最大的算式 时间限制:1.0s 内存限制:256.0MB 问题描述 题目很简单,给出N个数字,不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量大.因为 ...

  9. Java实现蓝桥杯VIP算法训练 纪念品分组

    试题 算法训练 纪念品分组 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得的纪念品价值 相对均衡, ...

随机推荐

  1. [转载]Sleep(x)的使用和sleep(0)作用解析

    链接:http://blog.csdn.net/m_leonwang/article/details/28434383 假设现在是 2012-12-16 3:37:40,如果我调用一下 Thread. ...

  2. explain之三:MYSQL EXPLAIN语句的extended 选项学习体会,分析诊断工具之二

    MySQL 的explain命令有一个extended选项,我想可以很多人都没有注意,因为它对命令的输出结果没有任何改变,只是增加了一个warning.这个 warning中显示了MySQL对SQL的 ...

  3. PAT L3-008. 喊山(BFS)C4 初赛30分

    喊山(30 分) 喊山,是人双手围在嘴边成喇叭状,对着远方高山发出“喂—喂喂—喂喂喂……”的呼唤.呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成的“讯号”,达到声讯传递交流的目的. ...

  4. sql---left join;right join;inner join---区别

    sql---left join;right join;inner join---区别 分为以下几类: 1.内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等联接和自 ...

  5. 2015.1.31 DataGridView自动滚动到某行

    方法一.dv.CurrentCell = dv.Rows[i].Cells[2] 但此cell不能是隐藏cell 方法二. if (dgr.Index < dv_sel_aw.FirstDisp ...

  6. 11-04 SQLserver基础--连接查询、联合查询、索引

    一.子查询补充: Exists的用法: select*from haha where exists(select*from bumen where bumen.code=haha.bumen,and  ...

  7. docker 笔记(4) Dockerfile 常用的指令

    下面列出了 Dockerfile 中最常用的指令,完整列表和说明可参看官方文档. FROM指定 base 镜像. MAINTAINER设置镜像的作者,可以是任意字符串. COPY将文件从 build ...

  8. Android中Activity之间的数据传递

    在开发中,我们经常涌用到Activity,那么既然用到了Activity,就一定免不了在两个或者多个Activity之间传递数据.这里我们先说一说原理,然后在看看代码和例子. 情况A:我们需要从Act ...

  9. Windows系统上release版本程序bug跟踪解决方案-.dmp文件。

    使用场景: Win32程序在release模式下编译完成,发送给最终用户使用时,我们的程序有时候也会出现崩溃的情况,这个时候如果能快速定位崩溃原因或提供一些程序崩溃时的状态信息,对我们解决问题将会带来 ...

  10. intellij idea 在执行maven的操作 install等会出现中文乱码?其他程序打印正常?

    之前一直碰到过这个问题,也没在意,因为那个中文对我来说用处不大,今天看着务必难受,一定把他给解决了,查了一下,找到了解决方法,如下: 首先打开你的设置. Setting->maven->r ...