2020牛客暑期多校第十场 E - Game(思维)

传送门


首先一开始看到这题就很容易想到二分答案,但是遗憾的是只能向左推而不能向右推,因此我们需要的是考虑前面。然后平均是不难想到的,然后我们发现似乎需要考虑每一个单调不减的区间做平均,然后反复如此直到完成

实际上如果当前列的高度较高,那么就向前缀的所有块平均高度,否则只需要累加到前缀和中,然后每次更新答案 ⌈ s u m i ⌉ \lceil\frac{sum}{i}\rceil isum。这样做的想法是平均后剩余块每次都推到第一列直到不能再推,那么假设第一列一定是当前前缀中最高的,如果当前列的块较多那么就更新了第一列的高度,否则在前缀中未补齐的地方依次补即可

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int main(){
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        ll sum=0,ans=0,x;
        for (int i=1;i<=n;i++){      
            cin>>x;
            sum+=x;
            ans=max(ans,(ll)ceil((double)sum/i));
        }
        cout<<ans<<endl;
    }
    return 0;
}

你可能感兴趣的:(牛客比赛)