• CF23B:这**也叫绿题?


    先手一个题目链接


    题意

    现在聚会上有n个人参加,然后依次按照规律离开,第一次是有0个朋友的人离开,第二次是有1个朋友的人离开,第三次是有2个朋友的人离开,之后依次是有3,4,5,6……n-1个朋友的依次离开,求最后聚会最多将会剩下多少人。

    输入:第一行一个整数t,表示数据组数,之后t行每行一个整数n。

    输出:对于每组数据,输出一个答案。

    1<=t<=100000 , 1<=n<=100000。

    输入输出样例

    输入
    1   3
    输出
    1

    这道题打眼一看貌似是道水题,只是求最后剩下几个人,似乎很简单。但转眼一看,难度的后面却荡漾着充满生机的颜色,这普及+/提高的标签估计会让许多人望而却步。
    然而,这道题真的是绿题的难度吗?我们不妨试一试。
     
    这道题让我们求最多剩下的人数,每次离开的规律也都说明白了,一个模拟似乎就能解决问题。然而,这道题并没有规定初始状态,即哪些人有多少朋友我们是不知道的。既然如此,我们不妨枚举每一种可能的情况,或许就能找出这道题的规律,从而得到解题方法。

    我们将人看成点,两点之间有连线则代表这两人是朋友。

    当n == 0 :

    Party貌似并没有举行,或者,是压根就没人来,故最终只能剩下0人。

    当n == 1:

     此时只有A一个人来了,那么A当然不会有在场的朋友,于是,A在第一轮就立凯了(好惨一A),最终剩下0人。

    当n == 2:

     第一种情况,A和B虽然都来了,但是他们并不是好盆友,所以都会在第一轮立凯,最终剩下0人。

     第二种情况,A和B是好盆友,他们手牵着手♂来到了Party,并成功活过了第一轮。但是,第二轮中刷掉有一个朋友的,A和B都有一个朋友,所以还是得立凯。故最终剩下0人。

    综上,n == 2时最多剩下0人。

    到这里我不禁想,办Party的人有毛病吧,当人数<= 2,就一个留下的都没有

    但是不慌,或许人家就是想人不多就不开呢?我们继续推导下去。

    当n == 3:

     第一种情况,A、B、C三人互不认识,在第一轮全部立凯。

    第二种情况,三人中有且只有两人认识,第一轮中落单的C像飘零的孤鸟一般默默离去,第二轮中A和B携手立凯,最终剩下0人。

     第三种情况,三人中有一个人同时和另外两人有关系♂,则第一轮无人立凯,第二轮B和C因为都有A这个“好兄弟♂”,只能立凯,此时只剩A一个人,而第三轮立凯的条件是有2个朋友,A此时没有朋友,不会立凯,同理,之后的轮次中A也会活下来,直到Party结束。故最终剩下一个人。

     第四种情况,A、B、C都互相认识,三人都会在第三轮立凯,最终剩下0人。

     综上,当n == 3,最多剩下一人。

    到这里事情有了转机,最多剩下的终于不是0人。这使我们有了一丝希望。

    当n == 4:

    第一种情况,4人互不认识,第一轮全部立凯。

    第二种情况,4人中有且只有两人认识,第一轮落单的C和D立凯,第二轮A和B立凯,最终剩下0人。 

    第三种情况,如图(由于Na2S2O3语文太差已经不想用语言叙述),第一轮D立凯,第二轮B与C立凯,A活到最后,最终剩下一人。 

    第四种情况, 如图,第一轮无人立凯,第二轮B、D立凯,此时A和C都只剩一个朋友,不满足之后立凯的条件,故最终剩下2人。

    情况当然还有很多,这里不再枚举,读者感兴趣可以自己画一下。最终我们发现,当n == 4,最多剩下2人。

    这时似乎就有些规律了,当n>2时,最多剩下的人数是n-2

    这个式子看上去有些玄学,我们在这里简单推导一下。

    不妨设共有n人,每个人都互相认识,即每个人都有n-1个朋友,则所有人都会在n轮立凯。我们切断第一个人与第n个人的联系,不让他们当朋友,则已知第1轮到第n-2轮都没人立凯,而在第n-1轮,有n-2个朋友的人要立凯,于是第一个人和第n个人就立凯了,此时剩下的人还有n-2个朋友,不会在第n轮立凯,故最多剩下n-2人。若每个人并非都互相认识,则必然有人会提前立凯,使最终剩下的人数减少。故最多剩下的人数为n-2。

    以上内容只是我个人的理解,若有错误还望读者指出。

    附AC代码:

    #include <cstdio>
    using namespace std;
    int t, n;
    int main()
    {
        scanf ("%d", &t);
        while (t--)
        {
            scanf ("%d", &n);
            printf ("%d
    ", n > 2 ? n - 2 : 0);
            //三目运算,意为:若n>2,输出n-2,反之输出0 
        }
        return 0;
    }

    由此看来,这道题的难度绝不是绿题,只要认真想很容易解决。标签并不见得十分准确,所以以后做题不要被吓到,认真思考,总会有收获。

    既然这题标签已经这么不准了,我们不如联系管理员把它改成黑的吧。


    Thank you for reading.

  • 相关阅读:
    java 面试每日一题2
    java 面试每日一题
    java GUI画满天星
    java JPEGImageEncoder;图像处理
    spring mvc+myBatis配置详解
    myeclipse 常用快捷键总结
    Java 如何快速序列化
    java UUID
    vue +echarts树状图
    在线预览(pptx、ppt、pps、docx、doc、xlsx、xls)
  • 原文地址:https://www.cnblogs.com/Na2S2O3/p/13435868.html
Copyright © 2020-2023  润新知