1. 程式人生 > >I - Crossing River

I - Crossing River

nobody mem def print ota string.h printf string ble

A group of N people wishes to go across a river with only one boat, which can at most carry two persons. Therefore some sort of shuttle arrangement must be arranged in order to row the boat back and forth so that all people may cross. Each person has a different rowing speed; the speed of a couple is determined by the speed of the slower one. Your job is to determine a strategy that minimizes the time for these people to get across.

Input

The first line of the input contains a single integer T (1 <= T <= 20), the number of test cases. Then T cases follow. The first line of each case contains N, and the second line contains N integers giving the time for each people to cross the river. Each case is preceded by a blank line. There won‘t be more than 1000 people and nobody takes more than 100 seconds to cross.

Output

For each test case, print a line containing the total number of seconds required for all the N people to cross the river.

Sample Input

1
4
1 2 5 10

Sample Output

17

有兩種過河方法

1.讓最小的那個人一直來回載人過去
2.一群人過河,讓最小的兩個人過去,然後最小的人過來,還沒過去的最大兩個人過去,第二小的人在回來;一直重復;
最後比較兩種方法那個更好
分情況討論,小於4人可以直接找到方法;
要是大於4人,把四個人放在一組,然後比較兩種方法運人哪個更快,然後選快的那種;
不可以所有人都用同一種方法如何在比較,這樣還是太慢了

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<cmath>
#include<string.h>
#include<algorithm>
#define sf scanf
#define pf printf
#define cl clear()
#define pb push_back
#define mm(a,b) memset((a),(b),sizeof(a))
#include<vector>
const double pi=acos(-1.0);
typedef __int64 ll;
typedef long double ld;
const ll mod=1e9+7;
using namespace std;
int main()
{
    int re;
    int a[1005];
    cin>>re;
    while(re--)
    {
        mm(a,0);
        int n;
        cin>>n;
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
        }
        sort(a,a+n);
        int sum=0;
        int num=n/2;
        while(n>3)
        {
            int sum1=0,sum2=0;
            sum1=a[0]+2*a[1]+a[n-1];
            sum2=a[0]*2+a[n-1]+a[n-2];
            sum+=sum1<sum2?sum1:sum2;
            n-=2;
        }
        if(n==1)
        sum+=a[0];
        else if(n==2)
        sum+=a[1];
        else if(n==3)
        sum+=a[0]+a[1]+a[2];
        pf("%d\n",sum);
    }
    return 0;
}

I - Crossing River