二分法
不斷枚舉一個值,然后根據題目要求判斷,這個值與正確答案的大小關系,修改上下界的值,
無窮逼近正確答案,最后就是正確答案
1
#include <cstdio>
2
#include <algorithm>
3
4
const int SIZE = 50002 ;
5
6
int length , N , M ;
7
int distance[SIZE] ;
8
9
bool Judge(const int& value)
10

{
11
int num , i , pre ;
12
num = 0 ;
13
pre = 0 ;
14
15
for ( i = 0 ; i < N ; ++i )
16
{
17
if ( distance[i] - pre < value )
18
num++ ;
19
else
20
pre = distance[i] ;
21
}
22
23
if ( length - pre < value )
24
num++ ;
25
26
if ( num <= M )
27
return true ;
28
else
29
return false ;
30
31
32
}
33
34
int BiSearch()
35

{
36
int ans = 0 ;
37
int mid , left = 0 , right = length ;
38
39
while ( left <= right )
40
{
41
mid = (left + right) >> 1 ;
42
43
if ( Judge(mid) )
44
left = mid + 1 ;
45
else
46
right = mid - 1 ;
47
}
48
49
ans = left - 1 ;
50
51
return ans ;
52
}
53
54
int main()
55

{
56
// freopen("1.txt", "r", stdin) ;
57
58
int i ;
59
char strNum[12] ;
60
61
scanf("%d %d %d", &length, &N, &M) ;
62
63
getchar() ;
64
for ( i = 0 ; i < N ; ++i )
65
{
66
// scanf("%d", &distance[i]) ;
67
gets(strNum) ;
68
distance[i] = atoi(strNum) ;
69
}
70
71
std::sort(distance, distance + N) ;
72
73
printf("%d\n", BiSearch()) ;
74
75
return 0 ;
76
}

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

48

49

50

51

52

53

54

55



56

57

58

59

60

61

62

63

64

65



66

67

68

69

70

71

72

73

74

75

76
