在线评测:
http://codevs.cn/problem/4768/
整体思路:
二分答案,看可不可以就行
失误之处:
没有考虑中间没有石头的情况,
体会心得:
注意特殊情况特殊判断
AC代码:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cmath>
using
namespace
std;
int
l,n,m;
int
sz[100000];
bool
check(
int
x)
{
int
cnt = 0,dl = 0;
for
(
int
i = 1;i <= n;i++)
{
if
(sz[i] - sz[dl] < x)
{
cnt++;
}
else
{
dl = i;
}
}
if
(cnt > m)
return
false
;
return
true
;
}
int
main()
{
scanf
(
"%d%d%d"
,&l,&n,&m);
for
(
int
i = 1;i <= n;i++)
scanf
(
"%d"
,&sz[i]);
if
(!m)
{
printf
(
"%d\n"
,l);
return
0;
}
sz[n+1] = l;
int
lw = 1,rw = 1000000000;
while
(rw - lw > 1)
{
// printf("%d %d\n",lw,rw);
int
midn = (lw + rw) >> 1;
if
(check(midn))
{
lw = midn;
}
else
rw = midn;
}
printf
(
"%d\n"
,lw);
return
0;
}
|