Gotta Write A Code
C++博客
::
首页
::
新随笔
::
联系
::
聚合
::
管理
posts - 33, comments - 33, trackbacks - 0
<
2011年11月
>
日
一
二
三
四
五
六
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
1
2
3
4
5
6
7
8
9
10
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(5)
给我留言
查看公开留言
查看私人留言
随笔分类
CUDA(1)
Windows Programming(4)
算法题解(22)
随笔档案
2012年5月 (1)
2012年3月 (9)
2011年11月 (4)
2011年10月 (1)
2011年9月 (1)
2011年7月 (1)
2011年6月 (3)
2011年5月 (1)
2011年4月 (1)
2011年3月 (2)
2011年1月 (2)
2010年12月 (1)
2010年11月 (6)
搜索
最新评论
1. re: DX笔记[未登录]
OrOrOrz!!
--diryboy
2. re: 作品:动态语言AnyC 1.0
@so
其实里面的代码存在bug...
--qqdy
3. re: 作品:动态语言AnyC 1.0
游戏脚本高级编程的代码很好啊。
--so
4. re: 作品:动态语言AnyC 1.0
仰慕!!我刚开始学习编译呢
--coreBugZJ
5. re: AnyC:添加类型限制[未登录]
Orz!!
--diryboy
阅读排行榜
1. 逆序数及其求法(10745)
2. Poj 3310 判环+度(5966)
3. 水文一篇--基于CUDA的矩阵相乘(4602)
4. Poj2010 - 堆的应用(2468)
5. 水文:浅析PE File(2329)
评论排行榜
1. 作品:动态语言AnyC 1.0(4)
2. poj 3074(3)
3. ACM/ICPC杭州站 - hdu3680(3)
4. 水题四道 3-30(3)
5. POJ Challenge - 2011.04.10部分题解(3)
Poj 3104 二分答案
题意:烘干机,给出一堆衣服的水分a[i],在不加烘干机情况下自动每一分钟减少1水分,每分钟可以变改衣服(i)到烘干机中,每分钟减少k水分,求最少需要多少时间。
题解:第一时间就想到使用二分枚据答案+验证这种思路,不过这题还是有些陷阱需要注意。
1. 验证答案时,如果 a[i] <= mid,让它自然烘干即可 ; 如果a[i] > mid,那么烘干这件衣服可以分成两段时间:使用烘干机时间x1 + 自然烘干时间x2,那么可以列出等式:mid = x1 + x2; a[i] <= kx1+x2;于是得x1 >= (a[i] -mid)/(k-1);即得使用烘干机的最少时间x1
2.注意当k==1时,k-1 == 0,需要特殊处理,直接打出ans = maxV
3.注意当求left+right时,结果可能超出范围,正确的方法应该是left + (right - left)*0.5;
#include
<
stdio.h
>
const
int
N
=
100005
;
int
n;
int
a[N];
int
k;
bool
check(
int
_value)
{
int
cnt
=
0
;
for
(
int
i
=
0
; i
<
n;
++
i)
{
if
(a[i]
>
_value)
{
double
kk
=
((
double
)(a[i]
-
_value))
/
(k
-
1
);
cnt
+=
(
int
)kk;
if
(kk
-
(
int
)kk
>
0
)
{
++
cnt;
}
if
(cnt
>
_value)
{
return
false
;
}
}
}
return
(cnt
<=
_value);
}
int
BinarySearch(
int
_low,
int
_high)
{
int
left
=
_low;
int
right
=
_high;
int
mid;
int
ans
=
_high;
while
(left
<=
right)
{
mid
=
(left
+
(right
-
left)
*
0.5
);
if
(check(mid))
{
ans
=
mid;
right
=
mid
-
1
;
}
else
{
left
=
mid
+
1
;
}
}
return
ans;
}
void
Test()
{
int
maxV
=
0
;
for
(
int
i
=
0
; i
<
n;
++
i)
{
scanf(
"
%d
"
,
&
a[i]);
if
(maxV
<
a[i])
{
maxV
=
a[i];
}
}
scanf(
"
%d
"
,
&
k);
if
(k
==
1
)
{
printf(
"
%d\n
"
,maxV);
}
else
printf(
"
%d\n
"
,BinarySearch(
0
,maxV));
}
int
main()
{
while
(scanf(
"
%d
"
,
&
n)
!=
EOF)
{
Test();
}
return
0
;
}
posted on 2011-11-09 12:45
bennycen
阅读(1494)
评论(1)
编辑
收藏
引用
所属分类:
算法题解
Feedback
#
re: Poj 3104 二分答案
2011-11-09 16:39 |
小木
请教博主的如何让代码可以缩进的
回复
更多评论
刷新评论列表
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
hdu 2087 hud 1686
hdu 2896 多模式串匹配2
hdu 2222 多模式串匹配
水题两道
zoj 3542
poj 3074
逆序数及其求法
Poj 3310 判环+度
Poj 3104 二分答案
Poj1111 水题
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理