传送门
首先一开始看到这题就很容易想到二分答案,但是遗憾的是只能向左推而不能向右推,因此我们需要的是考虑前面。然后平均是不难想到的,然后我们发现似乎需要考虑每一个单调不减的区间做平均,然后反复如此直到完成
实际上如果当前列的高度较高,那么就向前缀的所有块平均高度,否则只需要累加到前缀和中,然后每次更新答案 ⌈ 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;
}