贪心策略:
要么让最快的人依次把最慢的两个人渡过河再回来。要么让最快的两个人先过河,最快的人回来,然后最慢的两个过河,第二快的回来。直到剩余人数少于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; }