此题的意思为给出n个硬币和q次查询,值得注意的是,硬币的价值是2的某次方,然后给出一个总价值b,然后让你找出是否有一些硬币加起来等于这个价钱,如果有则输出硬币的个数,如果没有则输出-1.
第一次做的时候想的比较简单,直接暴力减,然后超时了,然后看了看超时的数据,发现事情并不简单,第2组数据给的全是1,
顿时恍然大悟,觉得自己还是太蠢了,于是想了个方法,是这样的:
如果这个价值的硬币存在,且不大于总价值,则用总价值除以这个价值,(1)得出来的数s如果比这个价值的硬币数小,则总价值数直接减去得出的结果s*这个价值的硬币。(2)如果大的或等于,s直接减去硬币数*这个价值。
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
char s[400005];
int a[30],b[30];
int n,k;
int main()
{
scanf("%d%d",&n,&k);
getchar();
memset (a,0,sizeof(a));
memset (b,0,sizeof(b));
for (int i=0;i<n;i++)
{
scanf("%c",&s[i]);
a[s[i]-'a']++;
}
for (int i=0;i<26;i++)
{
if(k>=a[i])
{
b[i]=a[i];
k-=a[i];
}
else
{
b[i]=k;
break;
}
}
for (int i=0;i<n;i++)
{
if(b[s[i]-'a']>0)
{
b[s[i]-'a']--;
continue;
}
else
printf("%c",s[i]);
}
printf("\n");
return 0;
}