1 solutions

  • 0
    @ 2025-11-5 17:27:09

    C++ :

    #include <cstdio>
    #include <cstring>
    
    using namespace std;
    
    long long high[1000],f[1000];
    int n;
    
    int main(){
    	scanf("%d",&n);
    	memset(f,50,sizeof(f));
    	for(int i=1;i<=n;i++){
    		scanf("%lld",&high[i]);
    	}
    	f[1]=0;
    	for(int i=2;i<=n;i++){
    		if(high[i]==high[i-1]+1){
    			f[i]=f[i-1]+1;
    		}
    		//从哪里退
    		for(int j=3;j<=i-1;j++){
    			if(f[j]>50000000) continue;
    			//枚举退到哪里
    			for(int k=1;k<=j-2;k++){
    				long long tmp=f[j]+j-k+1;
    				long long kf=(1LL)<<(j-k);
    				if(high[k]+kf>=high[i]&&tmp<f[i]){
    					f[i]=tmp;
    				} 
    			} 
    		} 
    	}
    	if(f[n]>50000000){
    		printf("-1");
    	}
    	else{
    		printf("%lld",f[n]);
    	}
    	fclose(stdin);
    	fclose(stdout);
    	return 0;
    }
    
    • 1

    Information

    ID
    18443
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By