Game on Ranges (CF2C) (二分+贪心+仔细读题+正反序思想)
思路:
- 最小的最大值,明显二分思想
- ck的时候明显用贪心
- 发现正着贪心比较难处理
- 反之贪心,很好搞, 但是又发现他的顺序是固定的
- 这个时候不要被骗了, 虽然是固定的,但是我们就一定要去正着做吗
- 依然可以反着做, +一个约束条件就行了 (当前删除的值 要比本身修改前小)

#include <bits/stdc++.h> using namespace std; #define ri int #define M 2000005 int n,m; int T; int p[M]; int t[M]; int ck(int a) { int fg=1; for(ri i=1;i<=n;i++) t[i]=p[i]; for(ri i=n;i>=3;i--) { if(t[i]>a) { int tmp=t[i]-a; if(tmp>p[i]) tmp=p[i]; tmp/=3; t[i-2]+=tmp*2; t[i-1]+=tmp; t[i]-=tmp*3; } } for(ri i=1;i<=n;i++) if(t[i]<a) fg=0; return fg; } int main(){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); cin>>T; while(T--) { cin>>n; for(ri i=1;i<=n;i++) { cin>>p[i]; } int ans=0; int l=1,r=1e9; while(l<=r) { int mid=(l+r)>>1; if(ck(mid)) { // for(ri i=1;i<=n;i++) cout<<t[i]<<" "; // cout<<"\n"; ans=mid; l=mid+1; } else r=mid-1; } cout<<ans<<"\n"; } return 0; }