C++题解:狼人杀

本文通过一道数学问题介绍了如何计算狼人杀游戏中满足所有玩家需求的最少局数。蒜头和他的朋友们在玩狼人杀时,每个人都有最低次数要求。通过分析每个朋友的最低游戏次数和总游戏位置的关系,可以得出至少需要玩的局数。文章讨论了利用数学方法解决此类问题,并提供了C++代码实现,展示了如何通过最大值和总和来确定最少局数。
摘要由CSDN通过智能技术生成

     目录

题目 

题解


题目 

有一天蒜头邀请了包含自己一共 n 位朋友玩狼人杀游戏。狼人杀游戏每一局需要有 n - 1 位玩家和 1 位上帝,上帝不参与游戏负责监督和提供信息,所大家都不愿意当上帝。

现在蒜头知道第 i 个朋友至少想当 a_i​ 次玩家,那最少要玩多少局狼人杀才能满足大家的要求?请你帮蒜头计算一下。

输入格式

输入第一行一个整数 n(3≤n≤105) 表示朋友人数。

接下来一行输入 n 个空格分割的整数 a1​,⋯,an(1≤ai​≤10^9)。

 输出格式

输出最少需要玩多少局狼人杀。

输出时每行末尾的多余空格,不影响答案正确性

要求使用「文件输入输出」的方式解题,输入文件为 wolf.in,输出文件为 wolf.out

样例输入1

3
3 2 2

样例输出1

4

样例输入2

4
2 2 2 2

样例输出2

3

题解:

知识点:数学

分析:一局游戏只能提供 n-1 个游戏位置,而一共需要 s=a1+a2+……+an 个游戏位置,所以至少需要 ⌈s/(n+1) ⌉ 局游戏。但是一个人不可能在一局游戏中占连个位置,所以至少又需要  max{ai} 局游戏。两者(⌈s/(n+1) ⌉和max{ai})取大就是答案。要注意用long long数据类型和转换成浮点数再计算

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long LL;//注意用long long
LL x,sum,mx;
int main(){
    freopen("wolf.in","r",stdin);
    freopen("wolf.out","w",stdout);
    int n;
    scanf("%d",&n);
    for (int i=0;i<n;i++){
        scanf("%lld",&x);
        sum+=x;
        mx=max(mx,x);//取最大值
    }
    LL ans=ceil(1.0*sum/(n-1.0));//注意要*1.0,转换成浮点数计算,还要加上取整函数
    printf("%d",max(ans,mx));//取最大值
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值