打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
过河问题的代码实现

/*最佳方案构造:以下是构造N个人(N≥1)过桥最佳方案的方法:  
1) 如果N=1、2,所有人直接过桥。  
2) 如果N=3,由最快的人往返一次把其他两人送过河。  
3) 如果N≥4,设A、B为走得最快和次快的旅行者,过桥所需时间分别为a、b;
 而Z、Y为走得最慢和次慢的旅行者,过桥所需时间分别为z、y。那么    
 当2b>a+y时,使用模式一将Z和Y移动过桥;    
 当2b<a+y时,使用模式二将Z和Y移动过桥;    
 当2b=a+y时,使用模式一将Z和Y移动过桥。
这样就使问题转变为N-2个旅行者的情形,从而递归解决之。
     ……         
    A Z →          
    A ←          
    ……
也就是“由A护送到对岸,A返回”,称作“模式一”。

    ……          
    ……  
第n-2步:   A B →   
第n-1步:    A ←    
第n步:     Y Z →  
第n+1步:    B ←          
    ……
这个模式是“由A和B护送到对岸,A和B返回”,称作“模式二”。*/


#include <stdio.h>
#include <stdlib.h>

int cmp(const int *a, const int *b)
{
    return *a - *b;
}

int main()
{
    int *array = NULL;
    int total, n, tmp;
 int fast1, fast2, slow1, slow2;
    scanf("%d", &n);

 total = 0;
    if(array)
    {
        free(array);
    }
    array = (int *)malloc(sizeof(int) * n);
    tmp = n;
    while(tmp --)
    {
        scanf("%d", &array[tmp]);
    }

 /*库函数提供的快速排序算法,只需要实现比较函数就可以了*/
    qsort(array, n, sizeof(int), cmp);

 fast1 = array[0];       //最快的
 fast2 = array[1];       //次最快的
 slow1 = array[n - 2];   //次慢
 slow2 = array[n - 1];   //最慢的

 while (1)
 {
  /*如果只有一个或两个或者三个,以最慢的人为参考*/
  if(1 == n)
  {
   total += slow2;
   break;
  }
  if(2 == n)
  {
   total += array[1];
   break;
  }
  if (3 == n)
  {
   total += slow2 + slow1 + fast1;
   break;
  }

  /*根据情况分别用模式一和模式二护送最慢的两个过桥*/
  if(2 * fast2 >= fast1 + slow1)
  {
   /*用最快的护送最慢的两个所需要的时间*/
   total += (slow1 + slow2 + 2 * fast1);
  }
  else
  {
   /*用最快的两个护送最慢的两个所需要的时间*/
   total += 2 * fast2 + fast1 + slow2;
  }
  n -= 2;
  slow2 = array[n - 1];
  slow1 = array[n - 2];  
 }

    if(array)
    {
        free(array);
    }     
 printf("%d\n", total);

    return 0;
}

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
LeetCode 202.快乐数(简单)
【LeetCode
阅读书目260-1:Thinking, Fast and Slow
MT4编程初级手册(8):循环语句
数据集分享 | IWR1642呼吸心跳数据集
剑指offer(C++)-JZ22:链表中倒数最后k个结点(数据结构-链表)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服