Gym - 101194D(Ice Cream Tower )二分+貪心
阿新 • • 發佈:2018-10-31
題意:
給出n個冰淇淋球,做一個冰淇淋需要k個冰淇淋球,要求相鄰的兩個球:下面的球的質量大於等於其上面的那個球質量的兩倍。 給出n個數(n個冰淇淋球的質量),求最多能做幾個冰淇淋。
題解:
n個冰淇淋球,做一個冰淇淋需要k個冰淇淋球,則最多可做n/k個,二分可做數,然後檢驗(貪心)。
- 二分答案:left = 0,right = n / k;
- 貪心檢驗:假設能做x個,這x個冰淇淋最上面的那個球一定是前x個最小的,然後雙指標逐步查詢第x個冰淇淋的下一個球。(這x個球同步進行)
#include <bits/stdc++.h> #define maxn 300010 typedef long long int ll; using namespace std; ll a[maxn],b[maxn]; int n,k; bool judge(int num) { for(int i=0;i<num;i++) b[i]=a[i]; int j=num; for(int i=num;i<num*k;i++) { while(a[j]<b[i-num]*2&&j<n) j++; if(j==n) return false; b[i]=a[j++]; } return true; } int main() { int T; scanf("%d",&T); for(int kase=1;kase<=T;kase++) { scanf("%d%d",&n,&k); for(int i=0;i<n;i++) { scanf("%lld",&a[i]); } sort(a,a+n); int l=0,r=n/k; while(l<r) { int mid=(l+r+1)/2; if(judge(mid)) l=mid; else r=mid-1; } printf("Case #%d: %d\n",kase,l); } return 0; }