CF23B Partyspa
題目大意:
有 \(n\) 我的參加聚會,第一次沒有在場朋友的人離場;第二次有一個在場朋友的人離場;第三次有兩個在場朋友的人離場,以此類推……
請你構造一種朋友關係(朋友關係是雙向的),使得最後剩下來的人最多,求最後剩下多少人。code
先把題目轉化一下,人至關於點,朋友關係至關於雙向邊。
根據題意,顯然須要犧牲某些人,使得他們離場後剩下的人都不會離場。再仔細思考一下,就會發現咱們要知足如下條件:get
而後咱們來看,犧牲的人數可不可能爲 \(1\)?
答案是不可能。由於若是犧牲這我的後剩下的人數爲 \(x\),這我的犧牲後全部人的度都會減一。那麼要使其餘人都留下來,就要求初始時剩下的人每一個人都 \(x+1\) 的度,而總人數才 \(x+1\),顯然這是不可能的。string
那犧牲兩我的呢?
若是這兩我的犧牲後仍然使每一個人的度減一,顯然是沒用的。因此咱們應該讓這兩我的每人都與剩下的人有關係。設剩下的人有 \(y\) 人。剩下的人能夠在初始時有 \(y+1\) 的度,這是能夠完成的。
再嘗試畫一個實際的圖,能夠發現咱們只要讓全部剩下的人連成徹底圖,讓犧牲的兩我的與每一個點都連邊便可。
注意當 \(n=1\) 或 \(n=2\) 時沒人留下。it
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int T,n; int main() { scanf("%d",&T); while(T--) { scanf("%d",&n); printf("%d\n",max(n-2,0)); } return 0; }