原文链接: 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;
}