最短过桥时间

       原是4人过桥,ABCD要单独过桥分别需要用时1分、2分、5分、10分,过桥需要灯(只有一盏),一次只能2人一起过(意味着需要有人送灯回来),过桥时间已用时多的人为准,你如何设计一个方案,让用的时间最少。

      问题分析:A和B先过,A回来,CD再过,B回来,AB第二次过。17秒完成!

                             用C语言拓展成n人过桥,过桥时间自定,求过桥最短用时的方案。

先解决最少时间过桥的问题。好好理解贪心法:

1)当人数<3时,直接过

2)当人数=3时,我们假设过河时间是从小到大的a,b,c (后期排列的问题易解决),显然用最小的来送灯(c+a+b

3)当人数=4时,a,b,c,d(同样是升序)

Ⅰ如果用最小的来送(配合最大的过去,a回来,再陪次大的过去,回来):d+a+c+a+b=d+c+b+2a

Ⅱ如果先让最小的两个过桥,再让其中一个回来,让最大的两个过桥,再让之前留下来的那个回来,再让最小的2个过桥:b+a+d+b+b=d+3b+a

当d+c+b+2a

4)当人数>4时,a,b....c,d(升序),如果让最小的来送,d+a+c+a=d+c+2a,如果先让两个最小的过桥b+b+a+d=d+2b+a.那么c-2b+a<=0时,用第一种方法。

对输入的数据可以用快速排序来排下序(关于qsort的使用,可以参见《使用VC库函数中的快速排序函数》)。

#include
#define MAX 100
int CrossBridge( int a[], int n)
{
     int time ;
     if (n==1)
     {
         time =a[0];
         printf ( "桥左->桥右:%d\n" ,a[0]);
         return time ;
     }
     else if (n==2)
     {
         time =a[1];
         printf ( "桥左->桥右:%d,%d\n" ,a[0],a[1]);
         return time ;
     }
     else if (n==3)
     {
         time =a[0]+a[1]+a[2];
         printf ( "桥左->桥右:%d,%d\n" ,a[2],a[0]);
         printf ( "返回送灯->:%d\n" ,a[0]);
         printf ( "桥左->桥右:%d,%d\n" ,a[0],a[1]);
         return time ;
     }
     else
     {
         if (2*a[1]>a[0]+a[n-2])
         {
             time =2*a[0]+a[n-1]+a[n-2];
             printf ( "桥左->桥右:%d,%d,\n" ,a[n-1],a[0]);
             printf ( "返回:%d\n" ,a[0]);
             printf ( "桥左->桥右:%d,%d\n" ,a[0],a[n-2]);
             printf ( "返回:%d\n" ,a[0]);
         }
         else
         {
             time =a[0]+a[1]+a[n-1]+a[1];
             printf ( "桥左->桥右:%d,%d\n" ,a[0],a[1]);
             printf ( "返回:%d\n" ,a[0]);
             printf ( "桥左->桥右:%d,%d\n" ,a[n-1],a[n-2]);
             printf ( "返回:%d\n" ,a[0]);
         }
         return time +CrossBridge(a,n-2);
     }
}
  
void sort( int b[], int n)
{
     int i,j,k,index,temp;
     for (i=0;i
     {
         index=i;
         for (j=i+1;j
         {
             if (b[index]>b[j])
             index=j;
         }
         temp=b[i];
         b[i]=b[index];
         b[index]=temp;
     }
     for (k=0;k
         printf ( "%-3d" ,b[k]);
}
  
int main()
{
     int crossnum,i;
     int t[MAX];
     printf ( "请输入要过桥的人数n:" );
     scanf ( "%d" ,&crossnum);
     printf ( "依次输入每个人过桥所需的时间\n" );
     for (i=0;i
     {
         scanf ( "%d" ,&t[i]);
     }
     printf ( "按升序自动排列:" );
     sort(t,crossnum);
     printf ( "过桥方案如下:\n" );
     printf ( "这%d人过桥的最短时间为:%d\n" ,crossnum,CrossBridge(t,crossnum));
     return 0;
}

你可能感兴趣的:(算法,C/C++)