StarCraft FZU - 2219

点击打开链接

这题是训练时队友写的 自己就没想到...

感觉二分很神奇 可以把很多复杂的问题简化成一个判定性的问题 在简化问题之后很多原本不可知的东西就变成已知量 从而可以找到更简单的方法来解决简化的问题 然后由这个问题的执行结果决定下一步该怎么做

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define ll long long

ll num[100010],tem[100010];
ll k;
int n,m;

bool judge(ll lim)
{
    ll pre;
    int cur,cnt;
    memcpy(tem,num,sizeof(num));
    cur=n,cnt=m,pre=0;
    while(1<=cnt&&cnt<=cur-1&&cur>=1)
    {
        if(tem[cur]+k<=lim)
        {
            tem[cur]+=k;
            cnt*=2,pre+=k;
        }
        else
        {
            cur--,cnt--;
            tem[cur]+=pre;
        }
    }
    if(cnt>=cur) return true;
    else return false;
}

int main()
{
    ll l,r,mid,ans;
    int t,i,j;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%I64d",&n,&m,&k);
        for(i=1;i<=n;i++)
        {
            scanf("%d",&num[i]);
        }
        sort(num+1,num+n+1);
        l=num[n],r=num[n]+20*k;
        while(l<=r)
        {
            mid=(l+r)/2;
            if(judge(mid))
            {
                r=mid-1;
                ans=mid;
            }
            else
            {
                l=mid+1;
            }
        }
        printf("%I64d\n",ans);
    }
    return 0;
}

阅读更多
文章标签: 二分 FZU
个人分类: 思维
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭