CF1003D

这道题就是有n枚硬币,每个硬币的币值都是2的次方(比如2 4 8 16之类的) 然后有q次询问,每次输入一个数,我们要用最少的硬币达到这个币值,如果存在结果的话就输出这个最小的使用硬币数,如果不存在的话,就输出-1

这道题应该算是一道贪心的题,我们先将2的各次方存到一个数组里,之后询问的时候,就先从最大的2的31次方开始找,然后记录一下就可以啦!

以下是代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n,q;
int sum[32];
int main(){
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
{
int k;
scanf("%d",&k);
int t=log2(k);
sum[t]++;
}
for(int i=1;i<=q;i++)
{
int k,ans=0;
scanf("%d",&k);
for(int j=31;j>=0;j--)
{
int cur=min(sum[j],k/(1<<j));
ans+=cur;
k-=(1<<j)*cur;
}
if(k!=0) printf("-1\n");
else printf("%d\n",ans);
}
return 0;
}

猜你喜欢

转载自www.cnblogs.com/fengxunling/p/9337666.html