第一次做div1的题,哈哈哈,参考了大佬的代码,学了二分,还是有点点收获的鸭
A. Mafia
分类:
思维,二分
题目大意:
有n个人玩游戏,每个人想玩的最少局数为a[i],每局游戏中有一个人是裁判(裁判不参与此局游戏),求最少进行多少局游戏,能够满足每个人的需求。
思路:
这道题读懂之后我才发现,有很多隐含条件,比如每个人都要从第一局玩到最后一局不能退出。
这道题的思路若集中在每个人玩了多少局,情况会比较复杂,所以主要看每个人当裁判的个数。设共要玩k局,则每个人当裁判的场数为k-a[i],k-a[0]+k-a[1]+…+ka[n-1]=kn-sum(sum为a的前n项和)
若k*n-sum>=k,就说明满足条件了
因此二分的判断条件也是k*n-sum>=k
代码:
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
int n;
ll sum;
ll judge(ll x)
{
if (x * n - sum >= x)
return 1;
return 0;
}
int main()
{
cin >> n;
ll max = 0, a;
sum = 0;
for (int i = 0; i < n; i++)
{
cin >> a;
if (a > max)
max = a;
sum += a;
}
ll l = max, r = sum, mid, ans;
while (l <= r)
{
mid = (l + r) / 2;
if (judge(mid))
{
ans = mid;
r = mid - 1;
}
else
l = mid + 1;
}
cout << ans << "\n";
return 0;
}