@[Lates](/user/119062) 头像好评
by HeartBlock_Love @ 2020-02-16 21:11:04
@[Lates](/user/119062) 您输出的f[n]是long long,但定义的是int,您可以改一下,看对不对(~~新兰CP~~)
by HeartBlock_Love @ 2020-02-16 21:13:04
@[愤怒的十九君](/user/177796) dalao我开long long了
`#define int long long`
by Lates @ 2020-02-16 21:15:06
@[Lates](/user/119062) 好吧,算我眼瞎
by HeartBlock_Love @ 2020-02-16 21:15:43
@[愤怒的十九君](/user/177796) orz
by Lates @ 2020-02-16 21:16:29
@[Lates](/user/119062)
```
if(a[i]+(1<<j-i)>=a[k])
```
(j-i)打?括号
by HeartBlock_Love @ 2020-02-16 21:16:46
@[愤怒的十九君](/user/177796) 加减法比位运算先算的
by Lates @ 2020-02-16 21:17:53
@[Lates](/user/119062) 对不起,让我再看一下
by HeartBlock_Love @ 2020-02-16 21:19:18
@[愤怒的十九君](/user/177796) 谢谢
by Lates @ 2020-02-16 21:19:41
@[Lates](/user/119062) 在您的代码的基础上稍微改动了几点
```
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define int long long
inline int read(){
register int x=0,v=1,ch=getchar();
while(!isdigit(ch)){if(ch=='-')v=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^'0');ch=getchar();}
return x*v;
}
const int MAX=205;
int n,f[MAX],a[MAX];
signed main(){
n=read();
for(register int i=1;i<=n;++i)a[i]=read();
memset(f,0x3f3f3f3f,sizeof(f));
f[1]=0;
for(register int i=2;i<=n;++i){
if(a[i]==a[i-1]+1||a[i]==a[i-1]+1)f[i]=min(f[i],f[i-1]+1);
}
for(register int i=1;i<=n;++i){
for(register int j=i-1;j>0;--j){
for(register int k=j-1;k>0;--k){
if(a[k]+(1<<j-k)>=a[i]){
f[i]=min(f[i],f[j]+j-k+1);
}
}
}
}
printf("%lld\n",f[n]>=0x3f3f3f3f?-1:f[n]);
return 0;
}
```
by HeartBlock_Love @ 2020-02-16 21:25:33