附加点TLE的可以看看下面的数据
1 2 100000
0 1
#include<bits/stdc++.h>
using namespace std;
int sign[100005];
int ans=INT_MAX;
int check(int n,int k,int len){
int cnt=0,prev=0;
for(int i=1;i<=n+1;i++){
while(sign[i]-prev>len){
cnt++;
prev+=len;
}
prev=sign[i];
}
cout<<"cnt:"<<cnt<<endl;
return cnt<=k;
}
int main(){
int L,n,k;
cin>>L>>n>>k;
for(int i=1;i<=n;i++){
cin>>sign[i];
}
sign[n+1]=L;
int l=0,r=INT_MAX,mid;
while(l<=r){
mid=(l+r)/2;
// if(mid==0){
// break;
// }
cout<<"mid:"<<mid<<" ";
if(check(n,k,mid)){
ans=min(ans,mid);
r=mid-1;
}
else{
l=mid+1;
}
}
cout<<ans;
return 0;
}
正确答案应该是1,如果不加被我注释掉的特判就会出现下面的情况
mid:1073741823 cnt:0
mid:536870911 cnt:0
mid:268435455 cnt:0
mid:134217727 cnt:0
mid:67108863 cnt:0
mid:33554431 cnt:0
mid:16777215 cnt:0
mid:8388607 cnt:0
mid:4194303 cnt:0
mid:2097151 cnt:0
mid:1048575 cnt:0
mid:524287 cnt:0
mid:262143 cnt:0
mid:131071 cnt:0
mid:65535 cnt:0
mid:32767 cnt:0
mid:16383 cnt:0
mid:8191 cnt:0
mid:4095 cnt:0
mid:2047 cnt:0
mid:1023 cnt:0
mid:511 cnt:0
mid:255 cnt:0
mid:127 cnt:0
mid:63 cnt:0
mid:31 cnt:0
mid:15 cnt:0
mid:7 cnt:0
mid:3 cnt:0
mid:1 cnt:0
mid:0
当mid为0时程序运行会死循环,所以当mid为0时要退出循环