共42道题,当前是第22

初赛真题

给出一堆长度各异的木棍,这些木棍能否头尾相连形成一个正方形?
输入:
第一行包含一个整数 $N$,为数据组数。接下来 $N$ 行,每行第一个数 $M$ 代表木棍的数量,第 $2$ 至 $M + 1$ 个数为每个木棍的长度。

输出:

对每组数据,输出 `yes` 或 `no` 表示这组木棍是否能拼成正方形。

样例输入
```
3
4 1 1 1 1
5 10 20 30 40 50
8 1 7 2 6 4 4 3 5
```
样例输出
```
yes
no
yes
```
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>

using namespace std;
const int MAXN = 25;

int side;
int m;
int sticks[MAXN];
bool visit[MAXN];

bool DFS(int sum, int number, int position) {
	if(___(1)___){
		return true;
	}
	int sample = 0;
	for (int i = position; i < m; ++i) {
		if (visit[i] || sum + sticks[i] > side || ___(2)___ ) {
			continue;
		}
		visit[i] = true;
		if (___(3)___) {
			if (DFS(0, number + 1, 0)) {
				return true;
			} else {
				sample = sticks[i];
			}
		} else {
			if (DFS(sum + sticks[i], number, i + 1)) {
				return true;
			} else {
				sample = sticks[i]; 
			}
		}
		visit[i] = false;
	}
	return false;
}

bool compares(int x,int y) {
	return x > y;
}

int main() {
	int n;
	scanf("%d", &n);
	while (n--) {
		int length = 0
		scanf("%d", & m);
		for(int i = 0; i < m; i++){
			scanf ("%d", &sticks[i]);
			length += sticks[i] ;
		}
		memset(visit, false, sizeof(visit));
		if(length % 4 != 0){
			printf("no\n");
			continue;
		}
		side = length / 4;
		sort(sticks, sticks + m, Compare);
		if(___(4)___){
			printf("no\n");
			continue;
		}
		if(___(5)___){
			printf("yes\n");
		} else {
			printf("no\n");
		}
	}
	return 0;
}

1. D。$number == 3$ 的原因见上述思路分析。
2. B。对应剪枝。
3. B。当前可以构成一条边的情况。
4. C。对应剪枝。
5. C。搜索初始状态是$(0,0,0)$ ,详见上述思路分析。

Question

1. (1) 处应填()。

2. (2) 处应填()。

3. (3)处应填()。

4. (4) 处应填()。

5. (5) 处应填()。

陈伦制作 版权所无 粤ICP备16127491号-1