CF348A Mafia 题解

Posted on 2024-03-09 12:29  _XOFqwq  阅读(5)  评论(0编辑  收藏  举报

由于题目具有十分明显的单调性(若 \(x\) 局能满足要求,则 \(>x\) 局一定能满足;若 \(x\) 局无法满足要求,则 \(<x\) 局也无法满足),因此我们考虑进行二分答案。

二分所需要的局数 \(x\),设所有人想玩的总局数为 \(S\),由题意可得 \(S=\sum^{n}_{i=1}a_i\)。因为每局都会有 \(1\) 人主持,\(n-1\) 名选手,所以当局数为 \(x\) 时总选手为 \((n-1) \times x\),显然这个值应当 \(\ge S\) 才能满足所有人的要求。

因此在二分时,若 \((n-1) \times x \ge S\),则向右区间扩展(因为要求最少局数),否则向左区间扩展即可。需要注意二分左右边界的设定。

#include<bits/stdc++.h>
#define int long long //(可能)需要开 long long
using namespace std;

int n,s,m,a[100031];

signed main(){
    cin>>n;
    for(int i=1;i<=n;i++) //读入并求出 S
    	cin>>a[i],s+=a[i],m=max(m,a[i]); 
    int l=m-1,r=s+1; //注意左右边界设定
    while(l+1<r){
        int mid=(l+r)>>1;
        if(mid*(n-1)>=s) r=mid; //满足条件就向右扩展
        else l=mid; //否则向左扩展
    }
    cout<<r; //注意输出的是 r(因为是最小值)
    return 0;
}