mayoko’s diary

プロコンとかいろいろ。

SRM 520 div1 easy: SRMCodingPhase

SRM 520 にちょっとだけ参加しました。easy だけささっと解いて yukicoder 参加です。あとで med も解きたいと思います。

解法

easy と med で luck を使う時間を全探索して,それでいてかつ解く順番も全探索して最大値を求めるだけ。

class SRMCodingPhase {
public:
    int countScore(vector <int> points, vector <int> skills, int luck) {
        int ans = 0;
        vector<int> lucks(3);
        vector<int> minus(3);
        minus[0] = 2; minus[1] = 4; minus[2] = 8;
        for (lucks[0] = 0; lucks[0] <= luck; lucks[0]++) {
            for (lucks[1] = 0; lucks[1] <= luck-lucks[0]; lucks[1]++) {
                lucks[2] = min(luck - lucks[0] - lucks[1], skills[2]-1);
                bool ng = false;
                for (int i = 0; i < 3; i++) {
                    if (lucks[i] >= skills[i]) ng = true;
                }
                if (ng) continue;
                vector<int> perm(3);
                for (int i = 0; i < 3; i++) perm[i] = i;
                do {
                    int t = 0;
                    int score = 0;
                    for (int i = 0; i < 3; i++) {
                        t += skills[perm[i]]-lucks[perm[i]];
                        if (t <= 75) score += points[perm[i]] - minus[perm[i]] * (skills[perm[i]]-lucks[perm[i]]);
                    }
                    ans = max(ans, score);
                } while (next_permutation(perm.begin(), perm.end()));
            }
        }
        return ans;
    }
};