啦啦啦啦啦啦啦今天继续二分答案
1.luogu2678 跳石头
这个题目的意思就是去掉规定的石头 使最短跳跃距离最大
这个题目就是枚举答案 累计比答案大的 跳跃距离 如果比规定的大 将right赋值为mid 反之 将left赋值为mid
代码附下:
#include<bits/stdc++.h>
using namespace std;
int L,N,M,D[50010];
bool check(int n){
int sum=0,temp=0;
for(int i=1;i<=N;i++){
if(D[i]-temp<=n) sum++;
else temp=D[i];
}
return sum<=M?1:0;
}
int main(int argc, const char * argv[]) {
cin>>L>>N>>M;
for(int i=1;i<=N;i++)
cin>>D[i];
D[0]=0;
int l=1,r=L;
while(l<r){
if(M==0){
l=L;
break;
}
int mid=(l+r)/2;
if(check(mid)) l=mid+1;
else r=mid;
}
cout<<l<<endl;
return 0;
}
2.luogu1316 丢瓶盖
这题题意与跳石头类似 但是我卡了好久好久 气死我了!!!!!
原因就是 return true 的时候 函数定义的是 int 就一直一直死循环 看也看不出来 ......无奈
代码附下:
#include<bits/stdc++.h>
using namespace std;
int a[100010]={0};
int n,m,l,r,mid;
bool check(int temp)
{
int s=1,flag=1;
for(int i=2;i<=n;i++)
{
if(a[i]-a[flag]>=temp)
{
flag=i;
s++;
}
}
if(s<m)return false;
else return true;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
sort(a+1,a+n+1);
l=1;r=a[n];
while(l+1<r)
{
mid=(l+r)/2;
if(check(mid))l=mid;
else r=mid;
}
if(check(r))printf("%d",r);
else printf("%d",l);
return 0;
}