过河啊(贪心加思维)

一群N人希望只用一条船过河,最多可载两人。因此,必须安排某种穿梭布置以便来回划船,以便所有人都可以穿越。每个人都有不同的划船速度; 一对夫妇的速度取决于较慢速度的速度。你的工作是确定一个策略,尽量减少这些人遇到的时间。
输入
输入的第一行包含一个整数T(1 <= T <= 20),即测试用例的数量。然后是T个案例。每个案例的第一行包含N,第二行包含N个整数,给每个人穿越河流的时间。每种情况都有一个空白行。不会超过1000人,没有人需要超过100秒才能过关。
产量
对于每个测试案例,打印一行包含所有N人过河所需的总秒数的行。
示例输入
1
4
1 2 5 10
示例输出
17

#include <iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
    int t,n,a[1005],i;
    scanf("%d",&t);
    while(t--)
    {
        int sum=0;
        scanf("%d",&n);
        for(i=0; i<=n-1; i++)
            scanf("%d",&a[i]);
        if(n==1)
            printf("%d\n",a[0]);
        else if(n==2)
        {
            if(a[0]>a[1])
                printf("%d\n",a[0]);
            else
                printf("%d\n",a[1]);
        }
        else
        {
            sort(a,a+n);
            if(n==3)
                printf("%d\n",a[2]+a[0]+a[1]);
            else
            {
                if(n%2==0)
                {
                    for(i=n-1; i!=1; i-=2)
                        sum+=min(a[1]+a[0]+a[i]+a[1],a[0]+a[i]+a[i-1]+a[0]);
                    sum+=a[1];
                }
                else
                {
                    for(i=n-1; i!=2; i-=2)
                        sum+=min(a[1]+a[0]+a[i]+a[1],a[0]+a[i]+a[i-1]+a[0]);
                    sum+=a[1]+a[0]+a[2];
                }
                printf("%d\n",sum);
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/najiuzheyangbaacm/article/details/80260060