过河问题nyoj47
时间限制:1000 ms | 内存限制:65535 KB
难度:5
- 描述
-
在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无论如何也不敢过桥去的。不幸的是,N个人一共只带了一只手电筒,而桥窄得只够让两个人同时过。如果各自单独过桥的话,N人所需要的时间已知;而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间。问题是,如何设计一个方案,让这N人尽快过桥。
- 输入
- 第一行是一个整数T(1<=T<=20)表示测试数据的组数
每组测试数据的第一行是一个整数N(1<=N<=1000)表示共有N个人要过河
每组测试数据的第二行是N个整数Si,表示此人过河所需要花时间。(0<Si<=100) - 输出
- 输出所有人都过河需要用的最少时间
- 样例输入
-
1 4 1 2 5 10
- 样例输出
-
17
#include <stdio.h> #include <stdlib.h> #define M 1001 int time[M]; int cmp(const void *a, const void *b) { return *(int *)a - *(int *)b; } int inmp(int a, int b) { return a <= b ? a : b; } int fan(int x) { int sum = 0; if(x == 1) sum = time[1];/*一个人*/ else if(x == 2) sum = time[2];/*2人一起过河,时间是最慢的那个*/ else if(x == 3) sum = time[3] + time[2] + time[1];/*3人就是加起来*/ else // sum = fan(x - 2) + 2 * time[2] + time[1] + time[x];/*没有比先让快的过去再让快的负责递手电快的多*//#1 { sum = fan(x - 2) + inmp(time[x]+time[2]*2+time[1], time[x]+time[x - 1] +time[1]*2);//注意‘,’右边的time[1]要乘以2,意思是速度最快的还要返回去*/ } return sum; } int main() { int n, num, i, min_t; scanf("%d", &n); while(n--){ scanf("%d", &num); for(i = 1; i <= num; i++){ scanf("%d", &time[i]); } qsort(time + 1, num, sizeof(time[0]), cmp); min_t = fan(num); printf("%d\n", min_t); } return 0; }
#1:我错了,如果第二个人与被接送的人的耗时相差很少,那么选择我说的方案就不够优秀,所以二者都要考虑