zoukankan      html  css  js  c++  java
  • 【做题记录】CF23B Party

    Problem

    CF23B Party

    题目大意:
    (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
    ",max(n-2,0));
    	}
    	return 0;
    }
    
  • 相关阅读:
    使用阿里云ECS安装HDFS的小问题
    退役回忆录嘤嘤嘤
    2018 ICPC北京 H ac自动机
    Educational Codeforces Round 54 (Rated for Div. 2) DE
    sa learning
    网络流learning
    Python模块logging
    Python模块unittest
    Linux /dev/shm
    Shell 字符串操作
  • 原文地址:https://www.cnblogs.com/mk-oi/p/14082983.html
Copyright © 2011-2022 走看看