经典指数          
原因
2337
浏览数
0
收藏数
 

(过河问题)在一个月黑风高的夜晚,有一群人在河的右岸,想通过唯一的一根独木桥走到河的左岸。在这伸手不见五指的黑夜里,过桥时必须借助灯光来照明,很不幸的是,他们只有一盏灯。另外,独木桥上最多承受两个人同时经过,否则将会坍塌。每个人单独过桥都需要一定的时间,不同的人需要的时间可能不同。两个人一起过桥时,由于只有一盏灯,所以需要的时间是较慢的那个人单独过桥时所花的时间。现输入n(2≤n<100)和这n个人单独过桥时需要的时间,请计算总共最少需要多少时间,他们才能全部到达河的左岸。 例如,有3个人甲、乙、丙,他们单独过桥的时间分别为1、2、4,则总共最少需要的时间为7。具体方法是:甲、乙一起过桥到河的左岸,甲单独回到河的右岸将灯带回,然后甲、丙再一起过桥到河的左岸,总时间为2+1+4=7。 #include 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(void) {     int i;     cin >> n;     for (i = 1; i <= n; i++) {         cin >> hour[i];         pos[i] = RIGHT;     }     cout << go(RIGHT_TO_LEFT) << endl;     return 0; } //true 转换成LEFT_TO_RIGHT使用 false同理

     举报   纠错  
 
切换
暂时还没有答案,欢迎分享你的解答 . . .
撰写答案
扫描后移动端查看本题