mayoko’s diary

プロコンとかいろいろ。

SRM 573 div1 easy: TeamContest

解法

貪欲法で解けます。

自チームに勝つためには, 相手はとりあえず強さが max の人はなるべく強いほうが良くて, それ以外の人はなるべく小さいほうが良いです。この規則でチームをどんどん作っていきましょう。

bool done[50];

class TeamContest {
public:
    int worstRank(vector <int> strength) {
        int n = strength.size();
        int score = max({strength[0], strength[1], strength[2]}) + min({strength[0], strength[1], strength[2]});
        vector<int> others;
        for (int i = 3; i < n; i++) others.push_back(strength[i]);
        sort(others.begin(), others.end());
        memset(done, false, sizeof(done));
        n = others.size();
        int ans = 1;
        for (int r = n-1; r >= 0; r--) {
            if (done[r]) continue;
            int l = 0;
            for (; l < r; l++) {
                if (!done[l] && others[r]+others[l] > score) break;
            }
            if (l==r) break;
            done[l] = done[r] = true;
            bool ok = false;
            for (int m = l+1; m < r; m++) if (!done[m]) {
                done[m] = true;
                ok = true;
                break;
            }
            if (!ok) break;
            ans++;
        }
        return ans;
    }
};