首页 > 代码库 > 过河问题 贪心

过河问题 贪心

过河问题

时间限制:1000 ms  |  内存限制:65535 KB
难度:5
 
描述

在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无论如何也不敢过桥去的。不幸的是,N个人一共只带了一只手电筒,而桥窄得只够让两个人同时过。如果各自单独过桥的话,N人所需要的时间已知;而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间。问题是,如何设计一个方案,让这N人尽快过桥。 

 
输入
第一行是一个整数T(1<=T<=20)表示测试数据的组数
每组测试数据的第一行是一个整数N(1<=N<=1000)表示共有N个人要过河
每组测试数据的第二行是N个整数Si,表示此人过河所需要花时间。(0<Si<=100)
输出
输出所有人都过河需要用的最少时间
样例输入
1
4
1 2 5 10
样例输出
17
#include<iostream>
#include<cstdio>
#include<cstring>
#include<sstream>
#include<algorithm>
#include<queue>
#include<vector>
#include<cmath>
#include<map>
#include<stack>
#include<set>
#include<fstream>
#include<memory>
#include<list>
#include<string>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
#define MAXN  1005
#define INF 1000000009
/*
过桥问题
    单独过桥时间已知,两人同时过桥 时间为较慢的那人的时间
    只有一个手电筒
    1 2 5 10
一开始的思路是让跑的最快的人来回送手电 ,但是最优解是两个最慢的同时过河
    T1 T2 T3 T4
    1来回送
    T2+T1+T3+T1+T4 2*T1+T2+T3+T4
    两个慢的同时过
    T1+T2+T4+T2+T2 3*T2+T1+T4
结论:如果(T1+T3)大于2T2,第二种方法优;如果(T1+T3)小于2T2,第一种方法优;如果(T1+T3)等于2T2,两种方法无差异。
当 n< 4
T1 T2 T3
T1+T2+T3
T1 T2 
T2
*/
int T, n, ans, Time[MAXN];
int main()
{
    scanf("%d", &T);
    while (T--)
    {
        scanf("%d", &n);
        for (int i = 0; i < n; i++)
            scanf("%d", &Time[i]);
        sort(Time, Time + n);
        ans = 0;
        while(n >= 4)//time[n-4] n-3 n-2 n-1 
        {
            ans += min(Time[n - 1] + Time[n - 2] + 2 * Time[0], Time[0] + Time[1] + Time[n - 1] + Time[1]);
            n -= 2;
        }
        if (n == 1) ans += Time[0];
        else if (n == 2) ans += Time[1];
        else ans += Time[0]+Time[1]+Time[2];
        printf("%d\n", ans);
    }
    return 0;
}

 

过河问题 贪心