A. Mafia

One day n friends gathered together to play "Mafia". During each round of the game some player must be the supervisor and other n - 1people take part in the game. For each person we know in how many rounds he wants to be a player, not the supervisor: the i-th person wants to play ai rounds. What is the minimum number of rounds of the "Mafia" game they need to play to let each person play at least as many rounds as they want?

Input

The first line contains integer n (3 ≤ n ≤ 105). The second line contains n space-separated integers a1, a2, ..., an (1 ≤ ai ≤ 109) — the i-th number in the list is the number of rounds the i-th person wants to play.

Output

In a single line print a single integer — the minimum number of game rounds the friends need to let the i-th person play at least ai rounds.

Please, do not use the %lld specifier to read or write 64-bit integers in С++. It is preferred to use the cin, cout streams or the %I64dspecifier.

Examples

input

Copy

3
3 2 2

output

Copy

4

input

Copy

4
2 2 2 2

output

Copy

3

Note

You don't need to know the rules of "Mafia" to solve this problem. If you're curious, it's a game Russia got from the Soviet times: http://en.wikipedia.org/wiki/Mafia_(party_game).

题意:

这道题,得题意读了半天还是错的,这个题是有n个人打比赛,然后每场比赛必须要有一个裁判,每个人要打ai场至少,问你最少多少场都可以满足这些n个人的要求。

思路:

一开始,我是没思路的,但慢慢发现二分答案可以,但那个判断不好处理,后来看了别人的题解才知道,

从裁判考虑:如果有k场,那么必须要有k个裁判,然后每个人可以担任裁判的次数是k-a[i]次,然后求和看是否大于等于k,如果可以则缩小,否则扩大。这里要注意但k必须要大于a[i].

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define LL long long

using namespace std;
const int maxn=1e5+100;
LL a[maxn];
int n;
bool check(LL x)
{
    LL cnt=0;
    for(int i=1;i<=n;i++)
    {
        if(x<a[i])
        {
            return false;
        }
        cnt+=x-a[i];
    }
    return cnt>=x;
}
int main()
{
    cin>>n;
    LL x=0;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        x+=a[i];
    }
    LL l=0,r=x+1;
    while((r-l)>1)
    {
        LL mid=(l+r)/2;
        if(check(mid))
        {
            r=mid;
        }
        else
        {
            l=mid;
        }
    }
    cout<<r<<endl;
    return 0;
}

反思:英文真的很重要,还有思维还是太僵硬阿。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值