1. 程式人生 > >div3 round#494 D. Coins and Queries

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;
}