这道题也是水题了,不过开始一直不知道在想什么,还是不够冷静。直接模拟:枚举n位数的所有01串,判断是否满足要求。不过我的这个方法里面用到一个位运算的小技巧:求从右数第n位的数字为什么数。
#include<cstdio>
#include<iostream>
#include<string>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1<<20;
int n,m,d[30],ans,cnt,lo,z;
bool vis,vis1;
void solve(int n){
cnt=0;
if(n==1){
cout<<2<<endl;
return;
}
for(int i=1;i<(1<<n);i++){///1 10
lo=-1;
z=0;
vis=vis1=false;
for(int j=1;j<=n;j++)
if(!((i>>(j-1))&1)){///求i右数第j位是什么数,动笔画一下就明白道理
vis=true;
z++;
if(lo==-1)
lo=j;
else if(j-lo>1)
{lo=j;}
else{
vis1=true;
break;
}
}
if(!vis||!vis1)
cnt++;
}
cout<<cnt<<endl;
}
int main(){
while(scanf("%d",&n)!=EOF){
solve(n);
}
return 0;
}