【做题记录】CF23B Party
Problem
题目大意:
有 \(n\) 个人参加聚会,第一次没有在场朋友的人离场;第二次有一个在场朋友的人离场;第三次有两个在场朋友的人离场,以此类推……
请你构造一种朋友关系(朋友关系是双向的),使得最后剩下来的人最多,求最后剩下多少人。
Solution
先把题目转化一下,人相当于点,朋友关系相当于双向边。
根据题意,显然需要牺牲某些人,使得他们离场后剩下的人都不会离场。再仔细思考一下,就会发现我们要满足以下条件:
- 牺牲的人不可能为0
- 牺牲所有人加起来一定与剩下的所有人有关系
- 剩下的人的朋友数应该都一样(这样可以保证不会出现意外QAQ)
然后我们来看,牺牲的人数可不可能为 \(1\)?
答案是不可能。因为如果牺牲这个人后剩下的人数为 \(x\),这个人牺牲后所有人的度都会减一。那么要使其他人都留下来,就要求初始时剩下的人每个人都 \(x+1\) 的度,而总人数才 \(x+1\),显然这是不可能的。
那牺牲两个人呢?
如果这两个人牺牲后仍然使每个人的度减一,显然是没用的。所以我们应该让这两个人每人都与剩下的人有关系。设剩下的人有 \(y\) 人。剩下的人可以在初始时有 \(y+1\) 的度,这是可以完成的。
再尝试画一个实际的图,可以发现我们只要让所有剩下的人连成完全图,让牺牲的两个人与每个点都连边即可。
注意当 \(n=1\) 或 \(n=2\) 时没人留下。
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;
}