CF348A Mafia 题解
由于题目具有十分明显的单调性(若 \(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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】