A Za, A Za, Fighting...
坚信:勤能补拙
PKU 1190 生日蛋糕
问题:
http://acm.pku.edu.cn/JudgeOnline/problem?id=1190
思路:
DFS+减枝,好题
代码:
1
/*
2
* N = R[1]^2*H[1] + R[2]^2*H[2] +
+ R[M]^2*H[M]
3
* S = R[1]^2 + 2R[1]*H[1] + 2R[2]*H[2] +
+ 2R[M]H[M]
4
*/
5
#include
<
stdio.h
>
6
#include
<
stdlib.h
>
7
#include
<
string
.h
>
8
#include
<
math.h
>
9
#define
MAX_LEVEL 21
10
#define
INF 0x7FFFFFFF
11
/*
from top level to the i[th] level, the minimum total volumn and area
*/
12
int
min_volumn[MAX_LEVEL], min_area[MAX_LEVEL];
13
int
n, m;
14
int
rt;
15
16
void
17
init()
18
{
19
int
i;
20
rt
=
INF;
21
min_volumn[
0
]
=
min_area[
0
]
=
0
;
22
for
(i
=
1
; i
<
MAX_LEVEL; i
++
) {
23
min_volumn[i]
=
min_volumn[i
-
1
]
+
i
*
i
*
i;
24
min_area[i]
=
min_area[i
-
1
]
+
2
*
i
*
i;
25
}
26
}
27
28
/*
from bottom(m[th] level) to the top
*/
29
void
30
dfs(
int
level,
int
last_r,
int
last_h,
int
cur_volumn,
int
cur_area)
31
{
32
int
r, h, tmp, v, a;
33
if
(cur_volumn
+
min_volumn[level]
>
n
||
cur_area
+
min_area[level]
>=
rt)
34
return
;
35
/*
ADD this pruning according the volumn&area formula
*/
36
if
(
2
*
(n
-
cur_volumn)
/
last_r
+
cur_area
>=
rt)
37
return
;
38
if
(level
==
0
) {
39
if
(cur_volumn
==
n)
40
rt
=
cur_area
<
rt
?
cur_area : rt;
41
return
;
42
}
43
/*
the minimal r in [level] would be level
*/
44
for
(r
=
last_r
-
1
; r
>=
level; r
--
) {
45
tmp
=
(
int
)((n
-
cur_volumn
-
min_volumn[level
-
1
])
/
(
double
)(r
*
r));
46
tmp
=
tmp
>
(last_h
-
1
)
?
(last_h
-
1
) : tmp;
47
for
(h
=
tmp; h
>=
level; h
--
) {
48
v
=
r
*
r
*
h;
49
a
=
2
*
r
*
h;
50
if
(level
==
m)
51
a
+=
(r
*
r);
52
dfs(level
-
1
, r, h, cur_volumn
+
v, cur_area
+
a);
53
}
54
}
55
}
56
57
int
58
main(
int
argc,
char
**
argv)
59
{
60
int
max_m_r, max_m_h;
61
while
(scanf(
"
%d %d
"
,
&
n,
&
m)
!=
EOF) {
62
init();
63
max_m_r
=
(
int
)(sqrt((n
-
min_volumn[m
-
1
])
/
(
double
)m))
+
1
;
64
max_m_h
=
(
int
)((n
-
min_volumn[m
-
1
])
/
(
double
)(m
*
m))
+
1
;
65
dfs(m, max_m_r, max_m_h,
0
,
0
);
66
if
(rt
==
INF)
67
printf(
"
0\n
"
);
68
else
69
printf(
"
%d\n
"
, rt);
70
}
71
}
posted on 2010-08-03 12:33
simplyzhao
阅读(501)
评论(0)
编辑
收藏
引用
所属分类:
B_搜索
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
PKU 3400 Dropping the stones
PKU 2312 Battle City (Cont.)
PKU 2312 Battle City
PKU 1010 STAMPS
PKU 3051 Satellite Photographs
PKU 1154 LETTERS
USACO Packing Rectangles
USACO Milking Cows
PKU 1167 The Buses
PKU 1664 放苹果
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
导航
C++博客
首页
新随笔
联系
聚合
管理
<
2010年8月
>
日
一
二
三
四
五
六
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
统计
随笔 - 209
文章 - 0
评论 - 7
引用 - 0
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(1)
给我留言
查看公开留言
查看私人留言
随笔分类
A_排序(7)
(rss)
B_搜索(47)
(rss)
C_动态规划(25)
(rss)
D_贪心(1)
(rss)
E_数据结构(6)
(rss)
F_图算法(16)
(rss)
G_其他(42)
(rss)
M_面试题集锦(17)
(rss)
P_珠玑
(rss)
R_找工复习2011(42)
(rss)
Z_小小知识点(3)
(rss)
随笔档案
2012年2月 (1)
2011年10月 (7)
2011年9月 (14)
2011年8月 (14)
2011年7月 (15)
2011年6月 (9)
2011年5月 (6)
2010年11月 (6)
2010年10月 (28)
2010年9月 (30)
2010年8月 (40)
2010年7月 (32)
2010年6月 (7)
搜索
最新评论
1. re: 2011字符串-最长重复子串,后缀数组[未登录]
5123
--123
2. re: 2011找工复习计划
明年秋季开找工作,表示难望楼主项背,学习了!
--QWhy
3. re: 2011找工复习计划
同学你好厉害呀!
--QWhy
4. re: 2011分治-平面最近点对(附C++源代码)
好东西啊,非常感谢!写的很简洁
--co
5. re: 2011知识点 - 优先级反转
@simplyzhao
呵呵,我最近也在找工作,国庆后去Marvell面试,不知道博主有没有时间交流下。
我的邮箱就是我的用户名@gmail。
--williamwue
阅读排行榜
1. epoll方法实现non-blocking socket(4629)
2. 根据(1,5)随机数生成器,生成(1,7)之内的随机数(3424)
3. [Tips][Original] qsort应用于指针数组与二维数组(字符)的差异(2113)
4. 2011分治-平面最近点对(附C++源代码)(1125)
5. 2011知识点 - 优先级反转(925)
评论排行榜
1. 2011知识点 - 优先级反转(3)
2. 2011找工复习计划(2)
3. 2011分治-平面最近点对(附C++源代码)(1)
4. 2011字符串-最长重复子串,后缀数组(1)
5. 2011知识点-TCP 区分消息边界[zz](0)