POJ-1700-Crossing River

贪心策略:

要么让最快的人依次把最慢的两个人渡过河再回来。要么让最快的两个人先过河,最快的人回来,然后最慢的两个过河,第二快的回来。直到剩余人数少于4人为止;

1700 Accepted 320K 16MS G++ 668B
#include "cstdio"
#include "algorithm"
using namespace std;
const int MAXN = 1000 + 5;
int arr[MAXN];
int cal(int n) {
    int ans = 0;
    while (n >= 4) {
        // 最快的人把最慢的两个人渡过河消耗的时间 
        int s1 = arr[n] + arr[n - 1] + arr[1] * 2;
        // 最快的两个人把最慢的两个人渡过河消耗的时间 
        int s2 = arr[2] * 2 + arr[1] + arr[n];
        ans += min(s1, s2);
        // 一次渡河之后不管选哪种渡河方式,最快的两个人都要回来 
        n -= 2;
    }
    if (n == 2) {
        return ans + arr[2];
    }
    for (int i = 1; i <= n; i++) {
        ans += arr[i];
    }
    return ans;
}
int main() {
    int t, n;
    scanf("%d", &t);
    while (t--) {
        scanf("%d", &n);
        for (int i = 1; i <= n; i++) {
            scanf("%d", &arr[i]);
        }
        sort(arr, arr + n);
        printf("%d\n", cal(n));
    }
    return 0;
}

 

posted @ 2019-01-31 12:18  Jathon-cnblogs  阅读(101)  评论(0编辑  收藏  举报