您的位置:首页 > 其它

FZU-1515 Balloons in a Box

2016-02-17 19:06 483 查看

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: