本文共 812 字,大约阅读时间需要 2 分钟。
此题的意思为给出n个硬币和q次查询,值得注意的是,硬币的价值是2的某次方,然后给出一个总价值b,然后让你找出是否有一些硬币加起来等于这个价钱,如果有则输出硬币的个数,如果没有则输出-1.
第一次做的时候想的比较简单,直接暴力减,然后超时了,然后看了看超时的数据,发现事情并不简单,第2组数据给的全是1,
顿时恍然大悟,觉得自己还是太蠢了,于是想了个方法,是这样的:
如果这个价值的硬币存在,且不大于总价值,则用总价值除以这个价值,(1)得出来的数s如果比这个价值的硬币数小,则总价值数直接减去得出的结果s*这个价值的硬币。(2)如果大的或等于,s直接减去硬币数*这个价值。
代码如下:
#include#include #include #include 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 =a[i]) { b[i]=a[i]; k-=a[i]; } else { b[i]=k; break; } } for (int i=0;i 0) { b[s[i]-'a']--; continue; } else printf("%c",s[i]); } printf("\n"); return 0;}