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; }