蓝桥杯练习4(balloon in box)

原创

首先记下一这个知识点:C语言程序中浮点数类型(%.2lf)编译器默认四舍五入,(最好自行测试一遍,可能不同平台使用的C语言版本不同,语言标准也有细微的区别。)如果不需要四舍五入,则要自行处理(浮点数{-5*10^{-x}},x=需要保留的小数位+1)。(已经写过测试代码进行了验证!!!)。另外,float精度是{2^{23}},能保证6位,double的精度是{2^{52}},能保证15位。

问题描述
  你要写一个程序,使得能够模拟在长方体的盒子里放置球形的气球。
  接下来是模拟的方案。假设你已知一个长方体的盒子和一个点集。每一个点代表一个可以放置气球的位置。在一个点上放置一个气球,就是以这个点为球心,然后让这个球膨胀,直到触及盒子的边缘或者一个之前已经被放置好的气球。你不能使用一个在盒子外面或者在一个之前已经放置好的气球里面的点。但是,你可以按你喜欢的任意顺序使用这些点,而且你不需要每个点都用。你的目标是按照某种顺序在盒子里放置气球,使得气球占据的总体积最大。
  你要做的是计算盒子里没被气球占据的体积。
输入格式
  第一行包含一个整数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

分析:题意核心为限制箱子内点可作为气球中心,且气球膨胀只能相切于箱子或者其他气球的条件,得到空间利用最大化。
相切只需要满足最强条件即可,即最先到达的距离,分两种可能,一种是相切于箱子的6个面中的某一面,一种是相切于其他气球(由球心和半径确定)。
1.相切于6个面中的某一面只是基于比较球心到这六个面距离的比较。
2.相切于其他气球采用先入为主的策略(并且后面使用全排列,保证每一种情况都经过比较),只和已经确定下来的气球作比较。相切的情况一定能通过达到最小的两点间距离减去零一球半径得到。

你的目标是按照某种顺序在盒子里放置气球,使得气球占据的总体积最大。即枚举
每一种可能,记录最大值即可。

其中枚举可使用next_permutation()函数,其中变量为数组起始位置和结束位置(+1?),其包含在头文件<algorithm>中。

代码如下,简单枚举每种排列计算最优即可

//回宿舍改
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
const double pi=acos(-1.0);
using namespace std;
typedef struct vp
{
    double  x,y,z;
    double r;
}P;
P e,s,vv[20];
double l,w,h;
int n;
bool judge(double x,double y,double z)
{
    if(fabs(x-e.x)>l||fabs(x-s.x)>l)
        return true;
    if(fabs(y-e.y)>w||fabs(y-s.y)>w)
        return true;
//    if(fabs(x-e.z)>h||fabs(x-s.z)>h)
//     bug如上所示
if(fabs(z-e.z)>h||fabs(z-s.z)>h)
        return true;
    return false;

}
double mindis(double x,double y,double z)
{
    double t1=min(fabs(x-e.x),fabs(x-s.x));
    double t2=min(fabs(y-e.y),fabs(y-s.y));
    double t3=min(fabs(z-e.z),fabs(z-s.z));
    double p=min(t1,t2);
    double pp=min(t3,p);
    return pp;
}
double point_dis(P p1,P p2)
{
    return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)+(p1.z-p2.z)*(p1.z-p2.z));
}
double area(double r)
{
    return r*r*r*pi*4/3.0;
}
int main()
{
    int a[10];

  while(cin>>n&&n>0)
{

cin>>e.x>>e.y>>e.z;
cin>>s.x>>s.y>>s.z;
l=fabs(e.x-s.x);
h=fabs(e.z-s.z);
w=fabs(e.y-s.y);
double total=l*h*w;
//cout<<total<<endl;
  for(int i=0;i<n;i++)
  {
      cin>>vv[i].x>>vv[i].y>>vv[i].z;
      a[i]=i;
  }
double maxx=0;
  do
  {
       double ini=0;
     for(int i=0;i<n;i++)
     {

         if(judge(vv[a[i]].x,vv[a[i]].y,vv[a[i]].z))
            continue;
            vv[a[i]].r=mindis(vv[a[i]].x,vv[a[i]].y,vv[a[i]].z);
         for(int j=0;j<i;j++)
         {
//             if(judge(vv[a[i]].x,vv[a[i]].y,vv[a[i]].z))
//            continue;
             double diss=point_dis(vv[a[i]],vv[a[j]])-vv[a[j]].r;
             if(diss<0)diss=0;
             vv[a[i]].r=min(vv[a[i]].r,diss);
        }
        ini+=area(vv[a[i]].r);
       // cout<<ini<<endl;
     }
   maxx=max(maxx,ini);
//     cout<<total<<endl<<ini<<endl;
//     cout<<vv[1].x<<"haha"<<vv[0].y<<endl;
  }while(next_permutation(a,a+n));
  //cout<<maxx<<endl;
  printf("%.0lf\n",total-maxx);
}


    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容