# 做不对的二分

>=x的最小值模板

while(l < r){
//mid的类型可以根据具体来变
int mid = l + r >> 1;
if(check(mid)) r = mid;
else l = mid + 1;
}


<=x的最大值模板

while(l < r){
//mid的类型可以根据具体来变
int mid = l + r + 1 >> 1;
if(check(mid)) l = mid;
else r = mid - 1;
}


while(r - l > eps){//此处的eps需要自己定义精度
if(check(mid)) l = mid;
else r = mid;
}


## 首先我们看最经典的跳石头问题

25 5 2
2
11
14
17
21

4

int l = 0,r = L;//左边界l为0，右边界r为起点石头到终点石头的距离
while(l < r){
int mid = l + r + 1>> 1;
if(check(mid)) l = mid;//如果treu就将左边界往右靠
else r = mid - 1;
}


bool check(int x){
int now = 0;//now为现在所处石头的坐标，刚开始设为0
int count = 0;//需要移走的石头数目
for(int i = 1;i <= n + 1;i++){
if(a[i] - a[now] < x) count++;/*如果面前的石头到现在所处

else now = i;//否则就跳过去然后把现在所处的石头更新
}
if(count <= m) return true;//如果需要移走的石头数<=规定的返回true
else return false;//否则返回false
}


#include <iostream>
#include <cstdio>

using namespace std;

const int N = 500010;

int n,m;//n为起点到终点的岩石数，m为组委会  至  多  移走的岩石数。
int L,a[N];

bool check(int x){
int now = 0;
int count = 0;
for(int i = 1;i <= n + 1;i++){
if(a[i] - a[now] < x) count++;
else now = i;
}
if(count <= m) return true;
else return false;
}

int main(){
scanf("%d%d%d",&L,&n,&m);

a[0] = 0;a[n + 1] = L;//0为起点石头，n+1为终点石头
for(int i = 1;i <= n;i ++) scanf("%d",&a[i]);

int l = 0,r = L;
while(l < r){
int mid = l + r + 1>> 1;
if(check(mid)) l = mid;
else r = mid - 1;
}
printf("%d",l);
return 0;
}


[4 2][4 5][1]

[4][2 4][5 1]

5 3
4 2 4 5 1

6

while(l < r){
int mid = l + r >> 1;
if(check(mid)) r = mid;
else l = mid + 1;
}


for(int i = 0;i < n;i ++){
scanf("%d",&a[i]);
r += a[i]; //r取了和
if(a[i] > l) l = a[i];	//l取了最大值
}


#include <iostream>
#include <cstdio>

using namespace std;

const int N = 1e5 + 10;

int n,m;
int a[N];
int l,r;

bool check(int x){
int sum = 0,cnt = 0;
for(int i = 0;i < n;i ++){
if(sum + a[i] <= x) sum += a[i];
else sum = a[i],cnt++;
}
return cnt < m;
}

int main(){
scanf("%d %d",&n,&m);

for(int i = 0;i < n;i ++){
scanf("%d",&a[i]);
r += a[i];
if(a[i] > l) l = a[i];
}
//r = 1000000000;
while(l < r){
int mid = l + r >> 1;
if(check(mid)) r = mid;
else l = mid + 1;
}
printf("%d",l);
return 0;
}


（以上为个人理解，我还是个编程菜鸟，嘻嘻~）

12-17 2978

11-09 3125
01-27 14万+
11-12 4805
04-27 13万+
08-01 4410
01-31 3746
12-03 31万+
01-28 1068
08-08 8万+
12-15 3万+
06-24 1万+
07-27 4万+
08-22 3万+
06-20 3502
06-27 2万+
11-17 8万+