1 条题解

  • 0
    @ 2025-9-10 0:11:57

    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

    信息

    ID
    3206
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者