HZOJ1325「20191104 模拟」灰烬
Solution
这一题主要是记一个思考时间复杂度的方向
这题的正解就是一个迭代加深搜索
但是为什么复杂度是对的呢
考虑最坏情况,如果只有第一个是1,其余均为0的话
那么最多需要6次
因此这题的层数非常小,考虑迭代加深
但是如果深度从0至6开始枚举,复杂度实际上是\(O(40^6)\),是过不掉的
我们既然知道答案不会超过6,那如果到5还没有答案的话,那就直接可以输出6
这个的复杂度是\(O(40^5)\)的,就可以过了
一定要注意,正常的位运算会爆int,(即使开#define int long long也没有用), 需要将\(1\) 改成\(1ll\)
#include<bits/stdc++.h>
using namespace std;
long long a;
int n;
void geta(void){
char ch = getchar();
while(ch != '0' && ch != '1') ch = getchar();
a = 0;
while(ch == '0'|| ch == '1'){
a = (a << 1) + ch - '0';
++ n;
ch = getchar();
}
}
bool dfs(int step, int depth, long long sta){
if(step == depth + 1){
if(sta == ( (1ll << n) - 1 ) ) return true;
return false;
}
for(register int i = 1; i < n; ++ i){
if(dfs(step + 1, depth, sta | (sta >> i))) return true;
}
return false;
}
inline void init(void){
n = 0; geta();
}
inline void work(void){
if((a >> (n - 1)) == 0){
printf("-1\n"); return;
}
for(register int i = 0; i <= 5; ++ i){
if(dfs(1, i, a)){
printf("%d\n", i); return;
}
}
printf("6\n");
}
int main(){
freopen("ash.in", "r", stdin);
freopen("ash.out", "w", stdout);
int T;
scanf("%d", &T);
while(T--){
init();
work();
}
return 0;
}

浙公网安备 33010602011771号