1. 程式人生 > 實用技巧 >GYM-100199C New Year Bonus Grant 貪心,樹

GYM-100199C New Year Bonus Grant 貪心,樹

GYM-100199C New Year Bonus Grant 貪心,樹

題意

本人英文能力有限,一開始甚至沒有讀懂題目。

歸納以後題意大致如下:

給出一棵樹,對這棵樹進行染色:

如果一個點被染色,那麼它的父親兒子兄弟結點都不能再染色。

問最多能染哪些。

分析

一開始想複雜了,在往樹形DP方面想,但最後列印方案這一步沒想出來。

後來發現貪心的選即可。

而且題中給定了上司的結點編號一定比下屬的結點編碼大,這樣就更方便處理了。

思路就是貪心的從葉子節點網上選。如果可以選就選。

簡要證明就是選葉子必然比選其他好,因為一旦選其他結點,會導致更多的點不能被選。

int fa[maxn];
bool vis[maxn];
vector<int> res;

int main() {
    freopen("grant.in", "r", stdin);
    freopen("grant.out", "w", stdout);
    int n = readint();
    for (int i = 0; i < n - 1; i++) {
        int x = readint();
        fa[i + 2] = x;
    }
    for (int i = n; i >= 2; i--)
        if (!vis[fa[i]] && !vis[i])
            vis[fa[i]] = vis[i] = 1, res.push_back(i);
    sort(res.begin(), res.end());
    printf("%lld\n", 1000 * (ll)res.size());
    for (int i = 0; i < res.size() - 1; i++) {
        printf("%d ", res[i]);
    }
    printf("%d", res.back());
}