FZU-1515 Balloons in a Box

Problem 1515 Balloons in a Box

题目描述

给你一个长方体,然后给定长方体中几个坐标,让你依次在这几个坐标上放气球,放入的气球会一直膨胀直到遇到长方体的外壁或是遇到其他的气球,希望你得出一种放气球的方式使得气球占有的总体积最大,题目要求输出长方体中剩余的体积

解题思路

因为数据范围很小,所以枚举所有的放气球的方法就好了,网上有用dfs的,我用的是STL的next_permutation,结果一样,最多省几行代码。
然后,THAT IS NOT THE KEY.
这道题教给我的是,如何控制输出格式,设置小数点后的位数要使用cout << fixed << setprecision() << ......;
还有吐个槽就是<cmath>中的round函数返回值居然是double,你都四舍五入了就不能给我个痛快吗。
还有福州大学的OJ和POJ居然都不支持# include <bits/stdc++.h>
</pre><h2><strong>代码</strong></h2><p></p><pre name="code" class="cpp">/****************************************************************
    > File Name: tmp.cpp
    > Author: Uncle_Sugar
    > Mail: uncle_sugar@qq.com
    > Created Time: 2016年02月17日 星期三 09时31分03秒
 ****************************************************************/
//# # include <bits/stdc++.h>
# include <iostream>
# include <algorithm>
# include <cmath>
# include <climits>
# include <cstdio>
# include <iomanip>
using namespace std;

const int debug = 1;
const int size  = 6 + 10;
const double Pi = acos(-1.0);
typedef long long ll;

struct point{
	double x,y,z;
	void read(){cin >> x >> y >> z;}
	bool operator < (const point& cmper)const{
		if (x!=cmper.x)
			return x<cmper.x;
		else if (y!=cmper.y)
			return y<cmper.y;
		else 
			return z<cmper.z;
	}
};

double square(double x){
	return x*x;
}
point coner[2];
point p[size];
double R[size];
double dist(const point& p1,const point& p2){
	double ret = square(p1.x-p2.x) + square(p1.y-p2.y) + square(p1.z-p2.z);
	return sqrt(ret);
}

double v_sph(double r){
	return 4.0/3*Pi*r*r*r;
}
double v_rec(point& p1,point& p2){
	return fabs((p1.x-p2.x)*(p1.y-p2.y)*(p1.z-p2.z));
}
int n;
int main()
{
	std::ios::sync_with_stdio(false);cin.tie(0);
	int i,j,k;
	while (cin >> n){
		for (i=0;i<2;i++)	coner[i].read();
		for (i=0;i<n;i++)	p[i].read();
		sort(p,p+n);
		double ans = 0;
		do{
			for (i=0;i<n;i++){
				double mindist = 100000;
				for (j=0;j<2;j++){
					point& P = p[i];
					point& C = coner[j];
					double dx = fabs(P.x - C.x);
					double dy = fabs(P.y - C.y);
					double dz = fabs(P.z - C.z);
					mindist = min(mindist,min(dx,min(dy,dz)));
				}
				for (j=i-1;j>=0;j--){
					double d = dist(p[i],p[j])-R[j];
					mindist = min(mindist,d);
				}
				R[i] = mindist;
				//# cout << R[i] << endl;
			}
			double tmp = 0;
			for (i=0;i<n;i++){
				if (R[i]>0)
					tmp += v_sph(R[i]); 
			}
			ans = max(ans,tmp);
		}while(next_permutation(p,p+n));
		ans = round(v_rec(coner[0],coner[1]) - ans);
		//# printf("%.0f\n",round(ans));
		cout << fixed << setprecision(0) << ans << endl;
	}
	return 0;
}







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值