GYM-100199C New Year Bonus Grant 貪心,樹
阿新 • • 發佈:2020-09-23
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()); }