题目:
http://codeforces.com/problemset/problem/349/C
题意:
n个人,每个人都有想要作为玩家的次数,每一场比赛必须要有一个评委。求出最少需要多少场比赛才能满足。
思路:
求出总次数sum,由于每一场比赛可以满足的次数是 (n-1),所以至少需要 sum/(n-1),再同最大的次数相比较。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 1e5+5;
long long a;
int main()
{
//freopen("in", "r", stdin);
long long n;
while(~scanf("%I64d", &n)) {
long long cnt = 0;
long long res = 0;
for(int i = 1; i <= n; ++i) {
scanf("%I64d", &a);
res = max(res, a);
cnt += a;
}
long long ans1 = cnt / (n-1);
if(cnt % (n-1) != 0) ans1++;
long long ans = max(ans1, res);
printf("%I64d\n", ans);
}
return 0;
}
思路二:
二分。
判断函数:mid - 每个玩家玩的次数 = 做评委的次数。相加应大于总的比赛次数以及最大玩的次数。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#define inf 0x3f3f3f3f
#define Inf 0x3FFFFFFFFFFFFFFFLL
#define eps 1e-9
#define pi acos(-1.0)
using namespace std;
typedef long long ll;
const int maxn=100000+10;
int num[maxn];
ll sum,maxL;
int n;
bool check(ll m)
{
ll cnt=0;
for(int i=0;i<n;++i)
cnt+=(m-num[i]);
return cnt>=maxL&&cnt>=m;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(~scanf("%d",&n))
{
ll L=0,R=Inf;
sum=0;maxL=0;
for(int i=0;i<n;++i)
{
scanf("%d",&num[i]);
maxL=max(maxL,(ll)num[i]);
sum+=num[i];
}
L=maxL;R=sum;
ll m;
while(L<R)
{
m=(L+R)>>1;
if(check(m))
R=m;
else
L=m+1;
}
printf("%I64d\n",L);
}
return 0;
}