1. 程式人生 > >2016 ACM-ICPC Asia China-Final D

2016 ACM-ICPC Asia China-Final D

連結:

題意:

給n個冰淇淋球,告訴每個冰淇淋球的體積,可以將若干個冰淇淋球堆成一個塔,需要滿足的條件是當前冰淇淋球的體積至少是在它上面的那個球的體積的兩倍,一個塔至少有k層,即一個塔至少由k個冰淇淋組成,問最多可以堆成多少個塔。

思路:

二分答案,檢驗是否可行。

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int maxn = 3e5+10;
ll a[maxn],b[maxn];
int t,T,n,k;
int judge(int 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 binsearch(int l,int r)
{
  while(l<r)
  {
      int mid =(l+r+1)/2;
      if(judge(mid)) l=mid;
      else r=mid-1;
  }
  return l;
}
int main()
{
    int cnt=1;
    for(cin>>T;T--;)
    {
        cin>>n>>k;
        for(int i=0;i<n;i++)
        {
            cin>>b[i];
        }
        sort(b,b+n);
        printf("Case #%d: %d\n",cnt++,binsearch(0,n/k));
    }
    return 0;
}