问题标题: 酷町堂:1364 打地鼠(mouse)5分

0
0
已解决
乔俊驰
乔俊驰
资深守护
资深守护
#include<iostream>
using namespace std;
int n,k;
char a[500005];
bool check(int mid){
    int cnt=0,i=0;
    while(i<=n){
        i++;
        if(a[i]=='1'){
            i+=k-1;
            cnt++;
        }

    }
    return cnt<=mid;
}
int main(){
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    int l=1,r=n;
    while(l<r){
        int mid=(l+r)/2;
        if(check(mid))  r=mid;
        else l=mid+1;
    }
    cout<<l;
    return 0;
}

哪错了


0
已采纳
刘英杰
刘英杰
新手天翼
新手天翼

1、二分有错误,应把l的初值改为0(因为可能整个数列没有1)

(以下均在check函数中)

2、一个字符串,最后一项应该是a[n-1],但你的查找写的是i<=n,这会导致判断出问题,应把i<=n改为i<n

3、i只有在没有地鼠的时候需要累加,应替换i++的位置,在if后面用else引导i++

4、mid是要判断的长度,而k是可以拍的次数,二者被你搞反了。修改:为什么要i+=k-1呢?

i+=mid他不香吗?

5、(上接4)还应该把下面判断的cnt<=mid改为cnt<=k

望采纳

刘英杰在2021-05-22 22:28:51追加了内容

对不起,我看错了,请无视第二项

0
0
0
汪宇航
汪宇航
新手启示者
新手启示者

1 111111111

0

试试这个样例,输出应该是0

0
我要回答