蓝桥杯2017年省赛

一.迷宫:广搜
1.数组清零:memset(flag, 0, sizeof(flag));

二.跳蚱蜢:广搜
1.广搜一般都要用node;
2.储存状态:用string,可以用swap函数;
3.状态(string)的去重:用set,insert(),allNode.find(nextStr) == allNode.end()
4.记得q.pop();

三.魔方状态:广搜
广搜:判断是否为广搜(每一步都有一个状态)、状态如何储存、状态如何变化、如何去重;
什么时候用深搜,什么时候用广搜:深搜:遍历、求所有状态;广搜:最后达到的是某个确定的状态、迷宫、连通块;

四.方块分割:深搜

void dfs(int x, int y) {
	if(x == 0 || y == 0 || x == 6 || y == 6) {
		ans++;
		return;
	}
	vis[x][y] = 1;
	vis[6 - x][6 - y] = 1;
	for(int i = 0; i < 4; i++) {
		int newx = x + newX[i];
		int newy = y + newY[i];
		if(newx >= 0 && newx <= 6 && newy >= 0 && newy <= 6 && vis[newx][newy] == 0) {
			dfs(newx, newy);
		}
	}
	vis[x][y] = 0;
	vis[6 - x][6 - y] = 0;
}

五、六.代码填空:动态规划、递归

七.正则问题:递归

int f() {
	int len = s.size();
	int m = 0;
	int tmp = 0;
	while(pos < len) {
		if(s[pos] == '(') {
			pos++;
			tmp += f();
		}
		else if(s[pos] == 'x') {
			pos++;
			tmp++;
		}
		else if(s[pos] == '|') {
			pos++;
			m = max(m, tmp);
			tmp = 0;
		}
		else {
			pos++;
			m = max(m, tmp);
			return m;
		}
	}
	m = max(m, tmp);
	return m;
}

八.包子凑数
1.解决“无限多种凑不出来”:
在这里插入图片描述
对于此方程,只有当A1、A2、……、An两两互质时才有解,若不互质则有无限多种凑不出,如何判断两两互质:利用 int gcd(a, b) 是否等于1;

2.解决“有限种凑不出来”:(为什么可以有边界?)

		dp[0] = 1;
		for(int i = 0; i < n; i++) {
			for(int j = 0; j + a[i] < maxn; j++) {
				if(dp[j] == 1) dp[j + a[i]] = 1;
			}
		}

九.分巧克力
枚举的优化:二分法

int binarySearch(int left, int right) {
	int mid;
	int cnt;
	while(left <= right) {
		mid = (left + right) / 2;
		cnt = 0;
		for(int i = 0; i < n; i++) {
			int m = h[i] / mid;
			int k = w[i] / mid;
			cnt += m * k;
			if(cnt >= k) break;
		}
		if(cnt >= k) {
			left = mid + 1;
		}
		else right = mid - 1;
	}
	return mid;
}

为什么得到的结果一定是满足条件“cnt >= k”的边长中最大的:if(cnt >= k) { left = mid + 1; } 每当满足条件后,都向边长更大的地方搜寻,所以二分得到的结果是有序数列最后一个满足条件的数;

十.油漆面积
暴力法优化:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值