- 题意:给出n个冰淇淋球,做一个冰淇淋需要k个冰淇淋球,并且规定对于上下相邻的两个球,
- 下面的球的质量大于等于其上面的那个球质量的两倍。
- 后面一行n个数,给出n个球的质量,问最多能做出多少个冰淇淋?
- 可以二分,假设能做x个冰淇淋,那么先安排最上面那个球,贪心的思想。
- 思路:二分答案,可以降低贪心要求 ,不需要知道怎么取最优,只知道 我要造多少个 那么每次都选取最小的去造。
- 分层去实现,如果这样不满足的话就是不合法结果 。
-
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll a[300005]; int n,k,id[300005],q,t,ca; bool ok(int m) { bool f; for(int i=1; i<=m; i++) id[i]=i; q=m+1; for(int i=1; i<k; i++) { for(int j=1; j<=m; j++) { f=1; for(; q<=n; q++) { if(a[q]>=2*a[id[j]]) { f=0; id[j]=q; q++; break; } } if(f) return 0; } } return 1; } int main() { scanf("%d",&t); while(t--) { scanf("%d%d",&n,&k); for(int i=1; i<=n; i++) scanf("%lld",&a[i]); sort(a+1,a+1+n); int l,r; l = 0,r = n/k; while(r > l) { int mid = (l+r)/2; if(ok(mid)) l = mid+1; else r = mid; } if(!ok(l))l--; printf("Case #%d: %d\n",++ca,l); } return 0; }
D - Ice Cream Tower Gym - 101194D -二分答案
最新推荐文章于 2022-03-14 23:42:39 发布