zoukankan      html  css  js  c++  java
  • 过河问题 还是不会 去学请教一下 数学老师 -----

    问题 B: 过河问题

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 10  解决: 1
    [提交][状态][讨论版]

    题目描述

    在一个月黑风高的夜晚,有一群人在河的右岸,想通过唯一的一根独木桥走到河的左岸.在伸手不见五指的黑夜里,过桥时必须借照灯光来照明,不幸的是,他们只有一盏灯.另外,独木桥上最多能承受两个人同时经过,否则将会坍塌.每个人单独过独木桥都需要一定的时间,不同的人要的时间可能不同.两个人一起过独木桥时,由于只有一盏灯,所以需要的时间是较慢的那个人单独过桥所花费的时间.现在输入N(2<=N<1000)和这N个人单独过桥需要的时间,请计算总共最少需要多少时间,他们才能全部到达河左岸.
      例如,有3个人甲  乙  丙,他们单独过桥的时间分别为1  2  4,则总共最少需要的时间为7.具体方法是:甲  乙一起过桥到河的左岸,甲单独回到河的右岸将灯带回,然后甲,丙在一起过桥到河的左岸,总时间为2+1+4=7.

    输入

    第一行为T,表示有T组数据,每组数据有两行 
    第一行为N,表示有N个人
    下面一行有n个数,表示每个人的过河时间

    输出

    全部人过河的最短时间

    样例输入

    1
    4
    1 2 5 10

    样例输出

    17

    分析:

    如果n==1或者n==2,所有人直接过河即可; 如果n==3,用时最短的和用时最长的一起过去,然后用时最短的回来,再和剩下的一个人过去 ; 如果n>=4,设a[0]表示用时最短的人所用的时间,a[1]为用时第二短的人所用的时间,a[n-1]表示用时最长的人所用的时间,a[n-2]表示用时第二长的人所用的时间。那么: 当2a[1] + a[0] + a[n-1] > 2a[0] + a[n-1] + a[n-2]时,就先让用时最短的人和用时最长的人一起过去,然后用时最短的回来,接着让用时最短的和用时第二长的一起过去,再让用时最短的回来。 否则,就先让用时最短的和用时第二短的一起过去,然后用时最短的回来,接着让用时最长和用时第二长的一起过去,再让用时第二短的回来。这样就相当于剩下了n-2个人。对这n-2个人执行相同的操作,知道剩下不足4个人即可。

     1 #include<stdio.h>
     2 #include<algorithm>
     3 using namespace std;
     4 int a[1005];
     5 int main()
     6 {
     7     int T, n, i;
     8     scanf("%d",&T);
     9     while(T--)
    10     {
    11         scanf("%d",&n);
    12         for(i = 0; i < n; i++)
    13             scanf("%d",&a[i]);
    14         sort(a,a+n);
    15         int sum = 0;
    16         while(n >= 4)
    17         {
    18             if((a[1] * 2 + a[n-1] + a[0]) > (2 * a[0] + a[n-1] + a[n-2]))
    19             {  //求出最长的两个人过桥所用的最短时间
    20                 sum += a[n-1]; //用时最短的和用时最长的一起过去
    21                 sum += a[0]; //用时最短的回来
    22                 sum += a[n-2]; //用时最短的和用时第二长的一起过去
    23                 sum += a[0]; //用时最短的回来
    24             }
    25             else
    26             {
    27                 sum += a[1]; //最短的和第二短的一起过去
    28                 sum += a[0]; //最短的回来
    29                 sum += a[n-1]; //最长的和第二长的一起过去
    30                 sum += a[1]; //第二短的回来
    31             }
    32             n -= 2;
    33         }
    34         if(n == 3)
    35             sum += a[1] + a[0] + a[2];
    36         else if(n == 2)
    37             sum += a[1];
    38         else
    39             sum += a[0];
    40         printf("%d
    ",sum);
    41     }
    42     return 0;
    43 }
  • 相关阅读:
    哈希表--扩展数组
    哈希表效率
    P=(1+1/(1-L))/2
    函数推进
    简单函数2
    简单函数
    getting data from the keybroad
    nutch-2.2.1 hadoop-1.2.1 hbase-0.92.1 集群部署(实用)
    hbase zookeeper独立搭建
    Orchard 介绍
  • 原文地址:https://www.cnblogs.com/A-FM/p/5179663.html
Copyright © 2011-2022 走看看