【作題記錄】CF23B Party

Problem

CF23B Partyspa

題目大意:
\(n\) 我的參加聚會,第一次沒有在場朋友的人離場;第二次有一個在場朋友的人離場;第三次有兩個在場朋友的人離場,以此類推……
請你構造一種朋友關係(朋友關係是雙向的),使得最後剩下來的人最多,求最後剩下多少人。code

Solution

先把題目轉化一下,人至關於點,朋友關係至關於雙向邊。
根據題意,顯然須要犧牲某些人,使得他們離場後剩下的人都不會離場。再仔細思考一下,就會發現咱們要知足如下條件:get

  • 犧牲的人不可能爲0
  • 犧牲全部人加起來必定與剩下的全部人有關係
  • 剩下的人的朋友數應該都同樣(這樣能夠保證不會出現意外QAQ)

而後咱們來看,犧牲的人數可不可能爲 \(1\)
答案是不可能。由於若是犧牲這我的後剩下的人數爲 \(x\),這我的犧牲後全部人的度都會減一。那麼要使其餘人都留下來,就要求初始時剩下的人每一個人都 \(x+1\) 的度,而總人數才 \(x+1\),顯然這是不可能的。string

那犧牲兩我的呢?
若是這兩我的犧牲後仍然使每一個人的度減一,顯然是沒用的。因此咱們應該讓這兩我的每人都與剩下的人有關係。設剩下的人有 \(y\) 人。剩下的人能夠在初始時有 \(y+1\) 的度,這是能夠完成的。
再嘗試畫一個實際的圖,能夠發現咱們只要讓全部剩下的人連成徹底圖,讓犧牲的兩我的與每一個點都連邊便可。
注意當 \(n=1\)\(n=2\) 時沒人留下。it

Code

#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;
}
相關文章
相關標籤/搜索