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;
}
posted @ 2019-11-12 21:14  沅芷澧兰  阅读(119)  评论(0)    收藏  举报