

这道题就是每次拿出k个,要求下面>=2*上面的。问最多找几摞。
方法:贪心+二分。二分枚举答案。每一次都是看是否合法。
从小到大排序,每次顶端放的都是最小的。
代码:
#include<bits/stdc++.h>
#define ll long long
#define mod 1000000007
#define inf 1e9
#define mem(a,x) memset(a,x,sizeof(a))
using namespace std;
int a[300010],b[300010];
int n,k;
bool check(int x)
{
int i,j,tot;
for(i=1;i<=x;i++)
{
b[i]=a[i];
}
for(i=2,tot=x+1;i<=k;i++)
{
for(j=1;j<=x;j++)
{
while(tot<=n)
{
if(b[j]*2<=a[tot])
{
b[j]=a[tot];
tot++;
break;
}
tot++;
}
if(tot>n)
{
return 0;
}
}
}
return 1;
}
int bSearch(int bi, int ed)
{
int mid, left = bi, right = ed;
while(left <= right)
{
mid = (left + right) >> 1;
if(!check(left)) right = mid - 1;
else left = mid + 1;
}
return left;
}
int main()
{
ios::sync_with_stdio(false);
int t,cas=1;
cin>>t;
while(t--)
{
int i,ans;
cin>>n>>k;
for(i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+n+1);
cout<<"Case #"<<cas++<<": "<<bSearch(1,n/k)<<endl;
}
}
本文介绍了一种结合贪心算法与二分查找的策略,用于解决特定的堆叠问题。该问题要求每次从一组数中取出k个数进行堆叠,使得下一层的每个数至少是上一层对应数的两倍,目标是找到能够堆叠的最大层数。文章通过代码示例详细展示了如何实现这一算法。
1490

被折叠的 条评论
为什么被折叠?



