1 solutions
-
0
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