div3 round#494 D. Coins and Queries

此题的意思为给出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;
}

猜你喜欢

转载自blog.csdn.net/qq_41410799/article/details/80925945