共42道题,当前是第12

初赛真题

(过河问题)在⼀个⽉⿊⻛⾼的夜晚,有⼀群⼈在河的右岸,想通过唯⼀的⼀根独⽊桥⾛到河的左岸。在伸⼿不⻅五指的⿊夜⾥,过桥时必须借照灯光来照明,不幸的是,他们只有⼀盏灯。另外,独⽊桥上最多能承受两个⼈同时经过,否则将会坍塌。每个⼈单独过独⽊桥都需要⼀定的时间,不同的⼈⽤的时间可能不同。两个⼈⼀起过独⽊桥时,由于只有⼀盏灯,所以需要的时间是较慢的那个⼈单独过桥所花费的时间。现在输⼊ $N(2 \leq N \leq 1000)$ 和这 $N$ 个⼈单独过桥需要的时间,请计算总共最少需要多少时间,他们才能全部到达河左岸。 

例如,有 $3$ 个⼈甲、⼄、丙,他们单独过桥的时间分别为 $1$、 $2$、 $4$ ,则总共最少需要的时间为 $7$。具体⽅法是:甲、⼄⼀起过桥到河的左岸,甲单独回到河的右岸将灯带回,然后甲、丙在⼀起过桥到河的左岸,总时间为 $2+1+4=7$ 。

#include<iostream>
#include<cstring>
using namespace std;
const int SIZE = 100;
const int INFINITY = 10000;
const bool LEFT = true;
const bool RIGHT = false;
const bool LEFT_TO_RIGHT = true;
const bool RIGHT_TO_LEFT = false;
int n, hour[SIZE];
bool pos[SIZE];

int max(int a, int b) {
	if (a > b)
		return a;
	else
		return b;
}

int go(bool stage) {
	int i, j, num, tmp, ans;
	if (stage == RIGHT_TO_LEFT) {
		num = 0;
		ans = 0;
		for (i = 1; i <= n; ++i)
			if (pos[i] == RIGHT) {
				num++;
				if (hour[i] > ans)
					ans = hour[i];
			}
		if (___(1)___)
			return ans;
		ans = INFINITY;
		for (i = 1; i <= n - 1; ++i)
			if (pos[i] == RIGHT)
				for (j = i + 1; j <= n; ++j)
					if (pos[j] == RIGHT) {
						pos[i] = LEFT;
						pos[j] = LEFT;
						tmp = max(hour[i], hour[j]) + ___(2)___;
						if (tmp < ans)
							ans = tmp;
						pos[i] = RIGHT;
						pos[j] = RIGHT;
					}
		return ans;
	}
	if (stage == LEFT_TO_ RIGHT) {
		ans = INFINITY;
		for (i = 1; i <= n; ++i)
			if (___(3)___) {
				pos[i] = RIGHT;
				tmp = ___(4)___;
				if (tmp < ans)
					ans = tmp;
				___(5)___;
			}
		return ans;
	}
	return 0;
}

int main() {
	int i;
	cin >> n;
	for (i = 1; i <= n; ++i) {
		cin >> hour[i];
		pos[i] = RIGHT;
	}
	cout << go(RIGHT_TO_LEFT) << endl;
	return 0;
}

1. C。
2. D。
3. A。
4. C。
5. B。

这段代码实际上是在对方案进行一个暴力枚举。每次执行 $go$ 函数时,在其中通过 $stage$ 来表示这次是要让左岸的一个人回到右岸,还是让右岸的两个人去到左岸。代码实现中,用一个 $pos$ 数组来表示每一个人当前所处于的位置,如果发现在右岸的人数不超过 $2$,那么就可以结束递归。否则就可以根据当前的 $stage$ 来枚举从右岸到左岸的两个人或者是从左岸回到右岸的一个人,枚举完方案后会得到一个子局面,所以函数会继续向下递归。

Question

1. (1) 处应填( )

2. (2) 处应填( )

3. (3) 处应填( )

4. (4) 处应填( )

5. (5) 处应填( )

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