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;
}
View Code

 

posted @ 2023-03-07 00:47  VxiaohuanV  阅读(17)  评论(0编辑  收藏  举报