CodeForces 23B Party (简单题)

题目类型  想法题

题目意思
现在派对中有 n 个人 (1 <= n <= 1e5), 人与人之间可能存在朋友关系 (这个关系是要你选定的)
刚开始的时候 没有朋友的人离场
下一时刻 如果某个人在剩下的人中有 1 个朋友, 那么这个人就要离场, 即所有在剩下的人中拥有 1 个朋友的人都要离场
再下一时刻 在剩下有人中拥有 2 个朋友的人离场 直到没有人离场为止, 问要怎么安排人与人之间的朋友关系才能使最后剩下的人尽量多
只需输出最后最多能剩下多少人

解题方法
首先 每个人与其他的人都是朋友关系 即每个人拥有 n - 1 个朋友 , 这时我们令 1 和 n 不是朋友 , 那么在 n 个人中
只有 1 和 n 是拥有 n - 2个朋友的, 他们在 n - 2 时刻就要离场了这时剩下的 n - 2个人中所有人都是拥有 n - 3个朋友, 而 n - 3时刻
已经过去 所以剩下的人都可以留下
注意当 n == 1时答案是 0 其他情况答案都是 n - 2

附加解释 :
首先派对至少会有一个人离场 因为总有一个朋友数最少的人会在某时刻第一个离场
假设这个人有 d 个朋友, 那么我们可以推理下看是否能剩下n-1个人
既然第一个走的人有 d 个朋友, 那么其他人至少有 d+1 个朋友(这样才可能是第一个人先走)
现在要求 第一个人走后剩下的人的朋友数要 <= d 才可能会出现最后剩下n-1个人的情况(下一时刻就是d+1时刻了)
那么就意味着第一个人与其他人都是朋友(这样第一个人走后其他人的朋友数都可以从 d+1变成 d,只有这样才可能满足条件)
这样的话第一个人就有 n-1个朋友了(因为除了第1个人其余的人数为n-1),那么就意味着刚开始其他人至少要有 d+1=n个朋友
(显然是不可能的,因为某个人的朋友数最多才是n-1) 所以我们可以发现 最后剩下 n-1个人是不可行的
那么我们可以考虑剩下n-2个人可不可以呢? 刚才推理剩下n-1个人不行的原因是 第一个离场的人任务太重了
(任务太重的意思是其他人最后不用离场都要他的配合)
那么可以考虑再加一个人来配合他, 例如刚开始时所有人都是相互的朋友, 只有1和n不是朋友, 那么朋友数最少显然是1和n
而且当1和n同时走了以后其他人的朋友数就降为n-3了(原来是n-1,剩下的人各少了两个朋友1和n)
n-3时刻已经过去了所以剩下的人都不用离场

参考代码 - 有疑问的地方在下方留言 看到会尽快回复的
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <set>
#include <map>
#include <string>
#include <algorithm>

using namespace std;

typedef long long LL;

const int MAXN = 1e2 + 10;

int main() {
  int t;
  scanf("%d", &t);
  while(t--) {
    int n;
    scanf("%d", &n);
    if(n == 1) printf("0\n");
    else printf("%d\n", n-2);
  }
  return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值