【題解】ZeroJudge d872: 過橋問題

題敘:https://zerojudge.tw/ShowProblem?problemid=d872
解題想法:

  • 先把 n 個人過橋需要的時間,由小到大排序 (A <= B <= C <= … <= X <= Y <= Z)。
  • Base conditions:
    • n == 0:花費時間 0
    • n == 1:花費時間 A
    • n == 2:花費時間 B
    • n == 3:(AC)一起過橋 -> A帶回手電筒 -> (AB)一起過橋:花費時間 C+A+B。
  • 當人數n >= 4, 有兩種策略(選擇(1)(2)兩個方案中時間較短的):
    • 1. (AB)一起過橋 -> A帶回手電筒 -> (YZ)一起過橋 -> B帶回手電筒:花費時間 B+A+Z+B。
    • 2. (AZ)一起過橋 -> A帶回手電筒 -> (AY)一起過橋-> A帶回手電筒:花費時間 Z+A+Y+A。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n, a, x, y;
    long long ans;
    vector <int> v;
    while (cin >> n){
        if (n == 0){
            cout << 0 << "\n";
            continue;
        }
        v.clear();
        ans = 0;
        for (int i = 0; i < n; i++){
            cin >> a;
            v.push_back(a);
        }
        sort(v.begin(), v.end());
        while (v.size() >= 4){
            x = v[0] * 2 + v[v.size()-2] + v[v.size()-1];
            y = v[0] + v[1] * 2 + v[v.size()-1];
            ans += min(x, y);
            v.resize(v.size()-2);
        }
        if (v.size() == 3){
            for (int i:v){
                ans += i;
            }
        }else if (v.size() == 2){
            ans += v[1];
        }else{
            ans += v[0];
        }
        cout << ans << "\n";
    }
}
分享本文 Share with friends