现在的位置: 首页 > 综合 > 正文

过河

2017年10月12日 ⁄ 综合 ⁄ 共 1056字 ⁄ 字号 评论关闭

Time Limit: 2 Seconds      Memory Limit: 65536 KB


现在有 N 个人想过河,但他们只有一条能容纳两个人的小船,且必须有一个人划船。每个人都有一个过河的时间,两个人在船上时,过河时间取决于较慢的一人。

现在请问要让 N 个人过河最少需要花多少时间?

输入格式

一个整数 T,表示有多少组测试数据。

接下来的 T 组测试数据,每组测试数据第一行是一个正整数 N (1 <= N <= 1000),表示人数。

接下来一行有 N 个数,第 i 个数表示第 i 个人的过河时间 Ti (0 <= Ti <= 100)。

输出格式

对于每组输入数据,输出一行一个数字,表示最少需要的过河时间。

样例输入

1
4
1 2 5 10

样例输出

17

解题思路:当n=1,2,3时所需要的最小时间很容易求得,现在由n>=4,假设n个人单独过河所需要的时间存储在数组t中,将数组t按升序排序,那么 这时将单独过河所需要时间最多的两个旅行者送到对岸去,有两种方式:

      1> 最快的(即所用时间t[0])和次快的过河,然后最快的将船划回来,再次慢的和最慢的过河,然后次快的将船划回来.

          即所需时间为:t[0]+2*t[1]+t[n-1]

      2> 最快的和最慢的过河,然后最快的将船划回来,再最快的和次慢的过河,然后最快的将船划回来.

          即所需时间为:2*t[0]+t[n-2]+t[n-1]

          这样就将过河所需时间最大的两个人送过了河,而对于剩下的人,采用同样的处理方式,接下来做的就是判断怎样用的时间最少.

#include <stdio.h>
#include <algorithm>
using namespace std;
int t[1000];
int main()
{
    int T, n, i;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d", &n);
        for(i = 0; i < n; i++)
            scanf("%d", &t[i]);
        sort(t, t+n);
        int sum = 0;
        for(i = n-1; i > 2; i -= 2)
        {
            if(t[0]+2*t[1]+t[i] > 2*t[0]+t[i]+t[i-1])
                sum += 2*t[0]+t[i]+t[i-1];
            else
                sum += t[0]+2*t[1]+t[i];
        }
        if(i == 0) sum += t[0];
        else if(i == 1) sum += t[1];
        else if(i == 2) sum += t[0]+t[1]+t[2];
        printf("%d\n", sum);
    }
    return 0;
}

抱歉!评论已关闭.