mayoko’s diary

プロコンとかいろいろ。

SRM 645 div1 easy:JanuszTheBusinessman

こういうの苦手。

問題:TopCoder Statistics - Problem Statement

解法:departure順に客をソートする。で,ある客がまだ処理済み出ない時,その客を処理できる中で最もdepartureするのが遅い客を選択する。この選び方で最適なのは帰納法的に証明できる(と思う)。直感的にはdepartureするのが早い人をカバーしながらdepartureがなるべく遅くなるように引っ張ってくるからですかね。ちょっと蟻本とか読んで復習してみます・・・
以下ソースコード

struct visit {
    int a;
    int d;
    visit(int a, int d) : a(a), d(d) {}
    visit() {}
    bool operator<(const visit& rhs) const {
        if (d != rhs.d) return d < rhs.d;
        return a < rhs.a;
    }
};

class JanuszTheBusinessman {
public:
    int makeGuestsReturn(vector <int> arrivals, vector <int> departures) {
        int n = arrivals.size();
        vector<visit> V(n);
        for (int i = 0; i < n; i++) V[i] = visit(arrivals[i], departures[i]);
        sort(V.begin(), V.end());
        int ret = 0;
        for (int i = 0; i < n; i++) {
            int last = i;
            for (int j = i; j < n; j++) {
                if (V[j].a <= V[i].d) last = j;
            }
            ret++;
            for (i = last; i < n; i++) {
                if (V[last].d >= V[i].a) continue;
                else break;
            }
            i--;
        }
        return ret;
    }
};