(过河问题)在⼀个⽉⿊⻛⾼的夜晚,有⼀群⼈在河的右岸,想通过唯⼀的⼀根独⽊桥⾛到河的左岸。在伸⼿不⻅五指的⿊夜⾥,过桥时必须借照灯光来照明,不幸的是,他们只有⼀盏灯。另外,独⽊桥上最多能承受两个⼈同时经过,否则将会坍塌。每个⼈单独过独⽊桥都需要⼀定的时间,不同的⼈⽤的时间可能不同。两个⼈⼀起过独⽊桥时,由于只有⼀盏灯,所以需要的时间是较慢的那个⼈单独过桥所花费的时间。现在输⼊ $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. (1) 处应填( )
2. (2) 处应填( )
3. (3) 处应填( )
4. (4) 处应填( )
5. (5) 处应填( )
陈伦制作 版权所无 粤ICP备16127491号-1