1. 程式人生 > >codeforces 349C Mafia [貪心]/[二分答案]

codeforces 349C Mafia [貪心]/[二分答案]

題目連結:http://codeforces.com/contest/349/problem/C
———————————————————————————————————————–.
C. Mafia
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
One day n friends gathered together to play “Mafia”. During each round of the game some player must be the supervisor and other n - 1 people 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 %I64d specifier.

Examples
input
3
3 2 2
output
4
input
4
2 2 2 2
output
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個人做遊戲,每次需要有一個人作為”Mafia”,剩下的人作為“player”,現在有n個人每個人想做“player”的次數,問你滿足所有人想做“player”的次數意願的同時最小遊戲次數是多少。

題目大意:
我是用二分答案做的,然後看了下別人的 發現直接貪心就可以了。。
對結果進行二分,然後check的時候,只要判斷所有人能做”Mafia”的次數能不能滿足mid就行了。

但是神TM二分範圍啊 ,本來想找找自信,結果r的範圍TM的WA三發、、、
首先l一定是max{ai}
然後r的範圍我設1ll<<62居然不行。1ll<<60居然還TM不行。?

最後1e12才過、、

附本題程式碼
—————————————————–。

#include <bits/stdc++.h>

using namespace std;

#define INF        (~(1<<31))
#define INFLL      (~(1ll<<63))
#define pb         push_back
#define mp         make_pair
#define abs(a)     ((a)>0?(a):-(a))
#define lalal      puts("*******");
#define s1(x)      scanf("%d",&x)
#define Rep(a,b,c) for(int a=(b);a<=(c);a++)
#define Per(a,b,c) for(int a=(b);a>=(c);a--)

typedef long long int LL ;
typedef unsigned long long int uLL ;

const int MOD = 1e9+7;
const int N = 100000+8;
const double eps = 1e-6;
const double PI = acos(-1.0);
void fre(){
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
}

/*************************************************/
LL a[N];
int n;
bool check(LL x){
    LL res = 0;
    Rep(i,1,n) res+=x-a[i];
    if(res>=x) return true;
    return false;
}

int main(){
    while(~s1(n)){
        LL l = 0,r=1e12,mid,ans=-1;
        Rep(i,1,n) scanf("%I64d",&a[i]),l=max(l,a[i]);
        while(l<=r){
            mid=(l+r)>>1;
            if(check(mid)){
                ans = mid;
                r=mid-1;
            }
            else l=mid+1;
        }
        printf("%I64d\n",ans);
    }
    return 0;
}