china final Problem D. Ice Cream Tower(二分)

原文链接: china final Problem D. Ice Cream Tower(二分)

上一篇: POJ 2785

下一篇: HDU 4310

http://codeforces.com/gym/101194/attachments

题意:

给出n个冰淇淋球,做一个冰淇淋需要k个冰淇淋球,并且规定对于上下相邻的两个球,下面的球的质量大于等于其上面的那个球质量的两倍。

后面一行n个数,给出n个球的质量,问最多能做出多少个冰淇淋?

题解:

这题可以二分,假设能做x个冰淇淋,那么先安排最上面那个球,贪心的思想,肯定取最小的x个,然后后面的类似取,线性扫一遍n,判断能否取x个

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

LL b[300005], a[300005];
int t, T, n, k;


int judge(int m){//检验m个冰淇淋能否做出来
    for(int i = 0 ; i < m ; i++)
        a[i] = b[i];
    int p = m;
    for(int i = m ; i < m * k ; i++){
        while(b[p] < a[i - m] * 2 && p < n) p++;
        if(p == n) return 0;
        a[i] = b[p];
        p++;
    }
    return 1;
}

int Bisection(int l, int r){//二分答案
    int ans = 0;

    while(l <= r){
        int mid = ( l + r ) / 2;
        if(judge(mid)) ans = mid, l = mid + 1;
        else r = mid - 1;
    }
    return ans;
}

int main(){
    scanf("%d", &T);
    for(t = 1 ; t <= T ; t++){
        scanf("%d%d", &n, &k);
        for(int i = 0 ; i < n ; i++) scanf("%lld", b + i);
        sort(b, b + n);
        printf("Case #%d: %d\n", t, Bisection(0, n / k));
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值