蓝桥杯 运送马匹

运送马匹
  有1个人,要把n匹马从A村运往B村。
  初始时,人和马都在A村。每次骑1匹马牵1匹马,回来时骑1匹马。
  已知每匹马从A村到B村需要的时间(数字越大越慢)
  两匹马同行时只能迁就较慢者。
  求所有马匹都运到B村的最小的运输时间(此时,人和马都在B村)。
  程序首先输入一个整数n(n<100),表示有n匹马。
  接着是n行整数,表示马从A村到B村的所用的分钟数(小于1000)
  程序输出:1个整数,表示所有马匹均运到B村的最小总耗时。
  例如,
输入:
3
1
2
4
程序应输出:
7
输入:
4
1
4
2
5
程序应该输出:

12


分析:在运送马匹的过程中,会发现有两种情况:1.用最快的马运;2.用最快的马和次快的马运。

比如:

1 4 2 5 这种情况,如果用最快马运4 5 两匹马需时4+1+5+1=11;如果用最快马和次快马运,先1 2过去,然后2回来,4 5一起过去,1回来,需时2+2+5+1=10

1 3 4 5 这种情况,如果用最快马运4 5两匹马需时4+1+5+1=11;如果用最快马和次快马运,先1 3过去,然后3回来,4 5一起过去,1回来,需时3+3+5+1=12

通过以上的例子我们可以总结出,有时候单匹马运输快,有时候两匹马运输快,所以在程序中需要判断一下到底哪种需时少一些,就采用哪种方案。



  1. public class Test006 {  
  2.   
  3.     private static int sum = 0;  
  4.     private static int[] a;  
  5.   
  6.     public static void main(String[] args) {  
  7.         Scanner sc = new Scanner(System.in);  
  8.         int n = sc.nextInt();  
  9.         a = new int[n];  
  10.         for (int i = 0; i < n; i++) {  
  11.             a[i] = sc.nextInt();  
  12.         }  
  13.         sc.close();  
  14.   
  15.         // 对马匹运输时间进行从小到大的排序  
  16.         Arrays.sort(a);  
  17.   
  18.         transferHorses(n);  
  19.   
  20.         System.out.println(sum);  
  21.     }  
  22.   
  23.     // 在运输的过程中,变化的东西是什么,A村还有多少个马匹待运,一直在减少  
  24.     // 把A村待运的马的数量抽象为变量x,x一直在减少  
  25.     private static void transferHorses(int x) {  
  26.         if (x == 0) {  
  27.             // 如果A村还没有马了,递归结束  
  28.             return;  
  29.         }  
  30.   
  31.         if (x == 1) {  
  32.             // 如果A村还有一匹马,一定是最快的马,一次运输  
  33.             sum += a[0];  
  34.             return;  
  35.         }  
  36.   
  37.         if (x == 2) {  
  38.             // 如果A村还有两匹马,一定是最快的马和次快的马,一次运输  
  39.             sum += a[1];  
  40.             return;  
  41.         }  
  42.   
  43.         if (x == 3) {  
  44.             // 如果A村还有三匹马,是最快的三匹马,两次运输  
  45.             sum += a[0] + a[1] + a[2];  
  46.             return;  
  47.         }  
  48.   
  49.         // 如果用最快马和次快马运输最后面两匹马,需要花的时间是time1  
  50.         int time1 = a[0] + 2 * a[1] + a[x - 1];  
  51.         // 如果只用最快马运输最后面两匹马,需要花的时间是time2  
  52.         int time2 = 2 * a[0] + a[x - 2] + a[x - 1];  
  53.   
  54.         // 将运输两匹马的消耗时间加上  
  55.         if (time1 < time2) {  
  56.             sum += time1;  
  57.         } else {  
  58.             sum += time2;  
  59.         }  
  60.   
  61.         // 继续递归运输马匹  
  62.         transferHorses(x - 2);  
  63.   
  64.     }  
  65. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值