B. Party

B. Party

题意

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

思路

当一个人或2个人的时候,将会剩下0个人,3个人以上,即n个人时,将会剩下(n-2)个。

转化成图论问题,就是每次去掉一个度为0的点,接下来去掉度为1的点,...,问你最后最多剩下几个顶点。

最少的话我们能够立即求出来,即整个图是一个完全图,每个顶点的度数是n-1,最后一起离开。

其次我们发现当n=1的时候,是0。

当n=2的时候也是0。

那么剩下的怎么考虑呢?

可以这样考虑

试想将定最少离开1个人,那么此人假设有d个朋友,那么剩下的人要是不走,那么此时剩下的人的朋友数将<d,如果只有一个人离开,那么d将会是n-1,那么就能得出原来除了走的那个人外,其余的(n-1)个人都有n个朋友,而在一个完全图中,一个点的度最大是(n-1),推出矛盾;
假设最少离开的人是2,那么成立,只需要假设n个人的关系构成一个去掉一条边的完全图,当前这个图只有去掉的那条边的两个端点的度是(n-2),其余的点的度都是(n-1),那么将这两个度为(n-2)的点去掉后,其余的点度都变为(n-2),此时剩下的这些度为(n-2)的点将剩下,所以,只要超过3个点,就可以构成一个完全图,所以超过三个点,最少删除2个点,若果是n个点,将剩下(n-2)个点。

代码实现

//链接:https://codeforces.com/problemset/problem/23/B
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 5;
int main(void) {
    int t;
    cin >> t;
    while(t--){
        int n;
        cin >> n;
        if(n==1) cout<<0<<endl;
        else cout<<n-2<<endl;
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/AC-AC/p/12503063.html