codeforces #202(div2) C

题意:一个party共n个人,要玩一个游戏,这个游戏每轮需要一个裁判,剩下的人参与,第i个人想要在不当裁判的情况下玩ai轮,求在满足所有人愿望的时候,最少玩的轮数

分析:最少的轮数肯定是个人最大轮数+1,如果轮数确定,那么轮数-ai就是该玩家在满足自身的情况下当裁判的最大次数,如果所有人能当裁判的轮数>=要玩的轮数,那么就是一个答案

只要找到最小的那个就好了,先找到最大的ai,然后把ai+1当作最小的轮数,计算裁判的次数,如果每再增加一轮游戏,能当裁判的次数要+n,

从ai+1枚举轮数,或者二分轮数,判断所有人能当裁判的总轮数>=要玩的轮数就可以了

我用的二分法

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int n,d[maxn];
typedef long long ll; 
ll tmp=0,l=0,r=1e13,res,L;

inline bool solve(ll m){
    ll t=tmp+(m-L)*n;
    return t>=m;
}

int main(){
    
    cin>>n;
    for(int i=0;i<n;i++)cin>>d[i],l=max(l,(ll)d[i]);
    L=l;
    for(int i=0;i<n;i++)tmp+=l-d[i];
    
    while(l<=r){
        ll mid=l+(r-l)/2;
        if(solve(mid))res=mid,r=mid-1;
        else l=mid+1;
    }
    
    cout<<res<<endl;
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/jihe/p/6574703.html