过河问题,新人求解
N个人,只有一条船,每个人都有一个划船速度,要求让N个人过河,一次渡河包括两个人先过去,一个人再回来。每次时间取两个人之间用时最多的,一个人的时候的时间就是他自己所用的。求让N个人过完河所用的最短时间。先把每个人的所需时间从小到大排序,先考虑简单的情况,一个人,自己过去就可以了。两个人,取时间最长的那个,三个人,最优的是三个人所用时间之和(每让最快的那个单独划船回来)。
四个人或四个以上,就要考虑不同的决策把最慢和次慢的人渡河。有两种决策。
1.始终让最快的单独划船。 最快的和最慢的一起渡河,然后最快的划回来,最快和次慢的一起渡河,最快的再回来。
2.让最快和次快的先过河,最快的划回来,接着最慢和次慢的过河,让次快的划回来。
两种决策中取时间最短的。
Sample Input
4
1 2 5 10
Sample Output
17
这是我的代码,总有两个测试用例过不去,求大神指点
#include <stdio.h>
#include <math.h>
int main()
{
int a[100000];
int i,j,t,N,m,n,t1,t2,k;
scanf ("%d",&N);
for (i=0;i<N;i++)
scanf ("%d",&a[i]);
for (i=0;i<N;i++)
for (j=0;j<N-i-1;j++)
{
if (a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
if (N>=4)
{
m=0;
n=0;
k=N%2;
for (j=0;j<(N/2);){
n=a[0]+a[1]+a[N-1-j]+a[1]+n;
j=j+2;}
if (k==0) t2=n+a[1];
else t2=n+a[0]+a[1]+a[2];
for (i=0;i<=(N/2);i++)
m=a[0]+a[N-i-1]+m;
if (k==0) t1=m-a[0];
else t1=m+a[1];
if (t1>t2)
printf ("%d\n",t2);
else
printf ("%d\n",t1);
}
else
{
if (N==1)
printf ("%d\n",a[0]);
if (N==2)
printf ("%d\n",a[1]);
if (N==3)
printf ("%d\n",a[0]+a[1]+a[2]);
}
}