【作题记录】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;
}
相关文章
相关标签/搜索