2017.8.12

来源:互联网 发布:mp4转gif mac 编辑:程序博客网 时间:2024/06/03 09:11

啦啦啦啦啦啦啦今天继续二分答案 

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;}