codeforces #202(div2) C
Posted 罚时自动机
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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; }
以上是关于codeforces #202(div2) C的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Beta Round #107(Div2)