Educational Codeforces Round 72 (Rated for Div. 2) B. Zmei Gorynich

2019-09-07 14:26:06
 
 
题意:龙有x个头,操作可以打掉它的若干个头,但没打掉全部的头后又会长出新的若干个头,有多个选择,问几次才能打掉龙的所有头。
思路:如果有比龙的初始头多的打击,则能一次打掉,如果不能一次打掉,且所有的打击比新生的小,则输出“-1”,其他的就是找打击和新生差值最大的,要注意的是最后一次打击可用最大打击的操作,因为最后的操作不用考虑新生的(一没想到这个点所以没过,太难受了)。
最后AC代码: 
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
int main(){
    int t;
    cin>>t;
    while(t--){
        char s[200005];
        cin>>s;
        int n=strlen(s);
        int num0=0,ans=0;
        for(int i=0;i<n;i++){
            if(s[i]=='0') num0++;
            else{
                int a=1,b=i;
                for(int j=1;j<20;j++){
                    if(a-j<=num0) ans++;
                    if(b+j>=n) break;
                    a=a*2+(s[b+j]-'0');
                }
                num0=0;
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

 

posted @ 2019-09-07 14:24  xunzf  阅读(72)  评论(0)    收藏  举报