求助
查看原帖
求助
760859
Let_Fly楼主2023/7/16 21:22

可过21个点qwq

#include<bits/stdc++.h>
using namespace std;
#define int long long

string a;
int n,sum=0;
int len,t[66],ans[66];

signed main(){
    cin>>a;
    cin>>n;
    int h=n;
    while(n){
        if(n%2==0){
            t[++len]=0;
            n/=2;
        }else if(n!=1){
            t[++len]=1;
            n/=2;
        }else{
            t[++len]=1;
            break;
        }
    }
    reverse(t+1,t+len+1);
    int flag=0;
    for(int i=0;i<a.size();i++){
        if(a[i]=='1'){
            flag=a.size()-i;
            break;
        }
    }
    if(flag>len){
        cout<<-1;
        return 0;
    }
    if(a.size()>len){
        int fl=0;
        int base=a.size()-len-1;
        for(int i=1;i<=len;i++){
            //cout<<a[i+base]<<' '<<t[i]<<'\n';
            if(a[i+base]=='?'){
                if(t[i]==1){
                    ans[i]=1;
                }else{
                    ans[i]=0;
                    fl=i;
                    break;
                }
            }else{
                if(a[i+base]=='1'&&t[i]==0){
                    cout<<-1;
                    return 0;
                }
                if(a[i+base]=='0'&&t[i]==1){
                    fl=i;
                    break;
                }
                ans[i]=t[i];
            }
        }
        if(fl){
            for(int i=fl+1;i<=len;i++){
                if(a[i+base]=='?')
                    ans[i]=1;
                else{
                    ans[i]=a[i+base]-'0';
                }
            }
        }
        for(int i=1;i<=len;i++){
            //cout<<ans[i]<<' ';
            if(ans[i])
                sum+=pow(2,len-i);
        }
    }else if(a.size()<len){
        int base=len-a.size();
        for(int i=0;i<a.size();i++){
            if(a[i]=='?'){
                ans[i+1]=1;
            }else{
                ans[i+1]=a[i]-'0';
            }
        }
        for(int i=1;i<=a.size();i++){
            if(ans[i])
                sum+=pow(2,a.size()-i);
        }
    }else{
        int head=1,flg=0;
        sum=-1;
        while(head<=len){
            sum=0;
            for(int i=1;i<=len;i++){
                if(a[i-1]=='?'&&i>=head){
                    ans[i]=1;
                }else if(a[i-1]=='?'&&i<head){
                    ans[i]=0;
                }else{
                    ans[i]=a[i-1]-'0';
                }
            }
            for(int i=1;i<=len;i++){
            //cout<<ans[i]<<' ';
                if(ans[i])
                    sum+=pow(2,len-i);
            }
            if(sum<=h&&sum!=-1){
                flg=1;
                break;
            }
            head++;
            //cout<<sum<<' ';
        }
        if(!flg){
            cout<<-1;
            return 0;
        }
    }
    cout<<sum;
    return 0;
}
2023/7/16 21:22
加载中...