算法训练 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 问题描述 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得的纪念品价值 相对均衡, ...
随机推荐
- Android实现推送方式解决方案 - 长连接+心跳机制(MQTT协议)
本文介绍在Android中实现推送方式的基础知识及相关解决方案.推送功能在手机开发中应用的场景是越来起来了,不说别的,就我们手机上的新闻客户端就时不j时的推送过来新的消息,很方便的阅读最新的新闻信息. ...
- 蓝桥杯 算法训练 ALGO-149 5-2求指数
算法训练 5-2求指数 时间限制:1.0s 内存限制:256.0MB 问题描述 已知n和m,打印n^1,n^2,...,n^m.要求用静态变量实现.n^m表示n的m次方.已知n和m,打印n^ ...
- Oracle之into
), NVL() INTO SALE_ID, STORE_ID FROM SALEFROMSTORE WHERE ORDERID = IN_ORDER_ID; 这里要注意,into的时候是一个sele ...
- Python 正则表达式取值
import re class Retest: def __init__(self,string,path): self.string = string self.path = path def re ...
- L2-020. 功夫传人(dfs+vector 或者 邻接矩阵+dij+优先队列)
L2-020. 功夫传人 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 一门武功能否传承久远并被发扬光大,是要看缘分的.一般来 ...
- Nginx配置文件中文注释详解
Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 Igor Sysoev ...
- Mybatis 内置 Java 类型别名与 typeHandlers
aliases There are many built-in type aliases for common Java types. They are all case insensitive, n ...
- 安卓读取SD卡的容量
在开发中,我们经常会用到SD卡,那么在对SD卡进行读写的时候,我们经常需要判断SD卡的剩余容量是否足够.因此,这次我们来写写获取SD卡容量的程序. 该注意的地方,我都在程序里面有注明了.看程序基本就懂 ...
- 201671010127 2016—2017-2 java学习新征程
通过大一整个学年对Python和C语言的学习,我对编程的感受有了更进一步的认识.随着时代的进步,编程语言也在实时更新,面对越来越多的编程语言,对于在编程方面的初学者,选择一门适合自己的编程语言就显得十 ...
- structs2----数据封装以及拦截器
技术分析之在Struts2框架中使用Servlet的API 1. 在Action类中也可以获取到Servlet一些常用的API * 需求:提供JSP的表单页面的数据,在Action中使用Servlet ...