过河问题nyoj47

时间:2021-04-21 15:27:53
时间限制: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 = ;
if(x == )
sum = time[];/*一个人*/
else if(x == )
sum = time[];/*2人一起过河,时间是最慢的那个*/
else if(x == )
sum = time[] + time[] + time[];/*3人就是加起来*/
else
// sum = fan(x - 2) + 2 * time[2] + time[1] + time[x];/*没有比先让快的过去再让快的负责递手电快的多*//#1
{
sum = fan(x - ) + inmp(time[x]+time[]*+time[], time[x]+time[x - ] +time[]*);//注意‘,’右边的time[1]要乘以2,意思是速度最快的还要返回去*/
}
return sum;
} int main()
{
int n, num, i, min_t;
scanf("%d", &n);
while(n--){ scanf("%d", &num);
for(i = ; i <= num; i++){ scanf("%d", &time[i]); }
qsort(time + , num, sizeof(time[]), cmp);
min_t = fan(num);
printf("%d\n", min_t); }
return ;
}

#1:我错了,如果第二个人与被接送的人的耗时相差很少,那么选择我说的方案就不够优秀,所以二者都要考虑