UVALive 2474 Balloons in a Box(枚举)

https://vjudge.net/contest/277824#problem/A

尤其是模拟题,三思而后敲!!!

纠错了好久,主要还是没有处理好:单点若还未放气球,其他气球可以膨胀越过它(即可以无视这个点);如果选到一个点,它已经在某一气球半径内了,则置r=0.

还参考了一些其他测试数据

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<vector>
 5 #include<cstring>
 6 #include<queue>
 7 #include<cmath>
 8 const double PI = acos(-1.0);//记住PI
 9 using namespace std;
10 int n, vis[10];
11 double maxm;
12 double x1, x2, yy1, y2, z1, z2;
13 double a[10], b[10], c[10], r[10];
14 double dist(double a, double b, double c){
15     return sqrt(a*a+b*b+c*c);
16 }
17 double cal_min(double a, double b, double c){
18     double tmp1 = min(fabs(a-x1), min(fabs(b-yy1), fabs(c-z1)));
19     double tmp2 = min(fabs(a-x2), min(fabs(b-y2), fabs(c-z2)));
20     return min(tmp1, tmp2);
21 }
22 void dfs(double sum, int k)
23 {
24     if(k == n){
25         maxm = max(sum, maxm);
26     }
27     else
28     for(int i = 0; i < n; i++){
29         if(!vis[i]){//主要问题处在下面的处理
30             r[i] = cal_min(a[i], b[i], c[i]);
31             for(int j = 0; j < n; j++){//这里不能加j!=i
32                 if(vis[j] == 1){
33                     if(dist(a[i]-a[j], b[i]-b[j], c[i]-c[j])>r[j])
34                         r[i] = min(dist(a[i]-a[j], b[i]-b[j], c[i]-c[j])-r[j], r[i]);
35                     else r[i] = 0;
36                 }
37             }
38             sum += r[i]*r[i]*r[i];
39             vis[i] = 1;
40             dfs(sum, k+1);
41             sum -= r[i]*r[i]*r[i];
42             vis[i] = 0;
43         }
44     }
45 }
46 int main()
47 {
48     int kase=0;
49     while(~scanf("%d", &n)&&n){
50
51         scanf("%lf%lf%lf", &x1, &yy1, &z1);
52         scanf("%lf%lf%lf", &x2, &y2, &z2);
53         for(int i = 0; i < n; i++){
54             scanf("%lf%lf%lf", &a[i], &b[i], &c[i]);
55         }
56         memset(vis, 0, sizeof(vis));
57         memset(r, 0, sizeof(r));
58         maxm = 0;
59         dfs(0, 0);
60         printf("Box %d: %.0lf\n\n", ++kase, (fabs(x2-x1)*fabs(y2-yy1)*fabs(z2-z1)-maxm*PI*4.0/3.0));//a*b*c-(4/3)*PI*r*r*r
61     }
62     return 0;
63 }

原文地址:https://www.cnblogs.com/Surprisezang/p/10222770.html

时间: 2024-11-08 21:27:51

UVALive 2474 Balloons in a Box(枚举)的相关文章

UVALive 6092 Catching Shade in Flatland --枚举+几何计算

题意:x=[-200,200],y=[-200,200]的平面,一天中太阳从不同角度射到长椅(原点(0,0))上,有一些树(用圆表示),问哪个时刻(分钟为单位)太阳光线与这些圆所交的弦长总和最长.太阳距离原点总是500m.(这些圆不会互相相交,每个圆都不包括原点或者不经过原点) 解法:直接暴力24*60分钟,找出此时的角度,然后求出直线方程,再枚举每个圆,求出弦长.注意这里每个圆都不包括原点,所以直线与圆的交点一定在同一侧,所以..我当时想多了,没看清题目.把他当成可以包含原点了,代码超长,幸好

UVa 1009 Balloons in a Box

方法:暴力 枚举 数据量较小,可以枚举所有n!个order,然后依次计算该order所对应的体积,更新答案.因为没有剪枝,所以用next_permutation 列出所有可能性即可. code: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <iostream> 5 #include <string> 6 #include <vector

UVALive 6885 Flowery Trails 最短路枚举

题目连接: http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=129723 题意: 给你一个n点m图的边 1到n有多条最短路,问你所有经过的边的总和*2是多少 题解: 对1,n分别求单源最短路径上spfa 枚举某条边是否为最短上的边 即 边权+disA[i] + disB[i] = 最短路长度,就是答案 #include<bits/stdc++.h> using namespace std; const int N =

UvaLive 6661 Equal Sum Sets 二进制枚举/DP

链接:http://vjudge.net/problem/viewProblem.action?id=49406 题意:根据给出的n,k,s求出n个数每个数都不大于k,和为s的序列(n个数每个都不同)的总情况数. 思路: 1.二进制枚举枚举出所有可能排列,并求和若和为s,则符合,否则不符合. 代码: #include<iostream> #include<set> #include<map> #include<queue> #include<cstri

UVALive 6692 Lucky Number (思路 + 枚举)

题意:给你n 个数字,某一个数的幸运数是这个数前面比他小 离他最远的位置之差,求出最大幸运值. 析:先按从大到小排序,然后去维护那个最大的id,一直比较,更新最大值就好. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include <cmath> #

UvaLive 4863 Balloons(贪心)

题意: 给定n个队伍, 然后A房间有a个气球, B房间有b个气球, 然后给出每个队伍所需要的气球数量和到A B房间的距离, 求把气球全部送到每个队伍的最短距离. 分析: 在气球充足的情况下, 那么我们对于每个队伍, 肯定是哪个房间近就取哪个房间的气球. 但是题目中气球的数目有限, 所以很有可能出现某个时刻第i个队伍到A比较近, 但是A没有气球了, 只能去B拿的这种情况.这样的损失就是他们的距离差. 所以猜想是先把到A和到B距离差较大的队伍先满足了, 这样就能降低损失, 有这种贪心的思想应该就能求

4.流程控制语句

流程控制语句 学习要点:1.语句的定义2.if语句3.switch语句4.do...while语句5.while语句6.for语句7.for...in语句8.break和continue语句9.whit语句 ECMAScript-262规定了一组流程控制语句.语句定义了ECMAScript中的只要语法,语句通常由一个或者多个关键字来完成给定的任务.诸如:判断.循环.退出等. 一.语句的定义 在ECMAScript中,所有的代码都是由语句来够构成的.语句表明执行过程中的流程.限定与约定,形式上可以

UVALive 6163(暴力枚举)

这道题我的做法就是枚举这四个数的所有排列所有运算所有计算顺序. 略有考验代码能力,不能漏掉情况,注意模块化的思想,一些功能写成函数调试的时候结构清晰好分析. 比赛时没有AC是对next_permutation()函数理解的不透,根本没有想到是没有从最小字典序开始枚举的问题. 就是next_permutation()函数是从当前顺序枚举到字典序最大的,而我开始时do里面的a数组不一定是字典序最小的,但是next_permutation()函数一定是从当前字典序往最大的枚举,所以漏掉了字典序很小的那

UVALive 6269 Digital Clock --枚举,模拟

题意:说不清楚,自己看吧,太恶心. 这题真是SB了,当时看了一下以为乱搞就好了,于是开始动手拍,结果拍了好几个小时都没拍出来,而且越想越想不通,直接把自己绕进去了,到最后全队指着我这道题决胜,结果gg了. 教训:甭管什么题,想清楚了再拍. 解法:枚举时间从00:00~23:59,数字显示用7位01串表示,如图: ,每次检查与给出的观察序列是否能够逻辑一致. 关键在check部分,这部分我都写了注释了,应该比较易懂了. 代码: #include <iostream> #include <c