樹形結構?貪心?思維?眼睛?
好有趣。。。 link
題目大意:給你一顆有 \(n\) 個節點的樹,你需要盡可能多的刪掉邊,使得剩下的圖中有 \(k\) 個點滿足互相能走到。求最後剩下的邊數。
我們深度剖析出題人其實是想考樹形 \(dp\) 的,可是呢,這其實就是道一眼題。
首先,我們剩下的圖最優情況一定是只剩 \(k\) 個點。
對於答案,最優的情況其實就是 \(k\) 個點分成 \(\lfloor \frac k 2 \rfloor\) 堆,使得每一堆只有兩個點或有一堆有三個點。這也是最理想的情況,但顯然一些樹無法滿足。不過你會發現,這個理想情況最後剩的邊為 \(\lceil \frac k 2 \rceil\)。
於是我們考慮原樹可以拆分成多少個多少堆,使得每一堆的點數不大於 \(2\),記能拆分出的個數為 \(cnt\)。
如果 \(cnt >= \lfloor \frac k 2 \rfloor\),也就是說這棵樹可以拆分出這麼多堆,那麼答案就是 \(\lceil \frac k 2 \rceil\)。
而如果 \(cnt < \lfloor \frac k 2 \rfloor\),也就是說這棵樹是不支援最優解的,那麼我們就運用一下貪心。首先我們需要剩餘 \(k\) 個點,而因為我們原樹只能拆出 \(cnt\) 堆,所以說這 \(k\) 個點中,一定有 \(cnt \times 2\) 個點可以成為理想情況。那麼我們就考慮剩下 \(k - cnt \times 2\) 個點怎麼辦。其實我也不知道怎麼辦,但我知道這些點一定能通過一條邊和已經處於理想情況的一堆連線起來,那麼累加邊即可。此時答案為 \(k - cnt \times 2 + cnt\),即 \(k - cnt\)。
把這兩種情況綜合一下就會得到答案:\(k - \min(\lfloor \frac k 2 \rfloor, cnt)\)。
關於 \(cnt\) 的求法,我們可以直接遍歷這棵樹。
對於節點 \(u\),它的子節點 \(v\),如果所有的 \(v\) 被取用過,我們就不取,並把 \(u\) 設為未被取用;如果有乙個 \(v\) 沒有被取用,我們就取沒被取用的第乙個 \(v\) 並把 \(u\) 設為被取用。可以結合**分析。
#include #include #include using namespace std;
typedef long long ll;
int read()
while (s >= '0' && s <= '9')
return x * k;
}void write(int x)
if (x > 9)
write(x / 10);
putchar(x % 10 + '0');
}void print(int x, char s)
int min(int x, int y)
const int maxn = 1e5 + 5;
int son[maxn], dp[maxn];
vectormp[maxn];
void add_edge(int u, int v)
int cnt = 0;
bool tree_dp(int u, int fa)
}return f;
}int main()
for (int i = 1; i <= n; i++) son[i] = mp[i].size();
cnt = 0;
tree_dp(1, 0);
print(k - min(cnt, k >> 1), '\n');
}return 0;
}
詩意的世界
什麼是詩意的世界?在現代這個社會中,還有多少人擁有著詩意的世界呢?我覺得在這個世界裡,人是放鬆的 自由的 心靈是愉悅的 又是充滿著美好與味道的 可以讀出詩一般意境的地方。這個地方不在世間,而是在人的內心。當然,世間也有很多美好的讓人窒息的地方,但是匆忙行路的人看不到路邊的風景,心情浮躁的人無心 外面...
詩意地生活
海德格爾說 人應當詩意地棲居。當飛鳥翱翔於天際,當鮮花盛開於大地,當人們臉上綻放出微笑,詩意便開始在生活中流淌。人應當詩意地生活。詩意地生活,源自人們內心的和諧。季羨林曾說過 真正的和諧是人內心的和諧。真正的和諧是人內心的和諧。試想,乙個內心渾濁不堪的人如何能 夠讓生活充滿詩意呢?乙個人的生活態度往...
淚水托起的詩意
不知塵世間,是不是能找到一把可以丈量思念深度的尺子?不知思念一旦長出翅膀,是不是能穿越時空到達逝去親人的天堂?不知靜夜散落的淚水,是不是能羽化為精靈潛入天國親人的夢鄉?不知淅淅瀝瀝的清明雨,是不是逝去的親人為了安慰生者的憂傷,特地噴灑潤濕的乾裂的止痛霜?千葉細語 清明時節雨紛紛,路上行人欲斷魂。初識...