问题 3895 --过河问题(完善程序)

3895: 过河问题(完善程序)★★★

时间限制: 2 Sec  内存限制: 128 MB
提交: 181  解决: 98
[提交][状态][命题人:]

题目描述

在一个月黑风高的夜晚,有一群人在河的右岸,想通过唯一的一根独木桥走到河的左岸。在这伸手不见五指的黑夜里,过桥时必须借助灯光来照明,很不幸的是,他们只有一盏灯。另外,独木桥上最多承受两个人同时经过,否则将会坍塌。每个人单独过桥都需要一定的时间,不同的人需要的时间可能不同。两个人一起过桥时,由于只有一盏灯, 所以需要的时间是较慢的那个人单独过桥时所花的时间。现输入n2≤n<100)和这n个人单独过桥时需要的时间,请计算总共最少需要多少时间,他们才能全部到达河的左岸。

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

#include <iostream> 
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)第1空的答案是:_______

   A.  num<=0     B. num<=1   C.  num<=2   D. num<=3

(2)第2空的答案是:_______

      A. go(RIGHT)                        B. go(!pos[i])  

     C. go(LEFT_TO_RIGHT)          D. go(RIGHT_TO_LEFT) 

(3)第3空的答案是:_______

   A. pos[i]==LEFT             B. pos[i]==RIGHT

   C. num<=2                 D. num<=3

(4)第4空的答案是:_______

    A. hour[i]+go(LEFT_TO_RIGHT) 

    B. hour[i]+go(RIGHT_TO_LEFT)

    C. go(LEFT_TO_RIGHT)

    D. go(RIGHT_TO_LEFT)

(5)第5空的答案是:_______

   A. return ans                      B. tmp=0

   C. pos[i]=RIGHT                 D. pos[i]=LEFT

提示

来源

 

[提交][状态]