C. Did We Get Everything Covered

原题链接

前情提要

限于自身知识水平的储备不足,无法对这道题的贪心算法做出一个证明,待来日学识渐长把这个证明写下

题解

我们可以把字符串s分成若干区间,每一区间对应一位数字的储备
已知长度为n,那我们就一位一位地遍历,一旦所有元素遍历齐就开始下一位的遍历,因为再往后遍历也不起作用
然后取每一位最后一个收集齐的字母因为这一位想要出现这个字母就必须要取它,最后几位取没有遍历到的字母重复即可

code

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,k,m;
        cin>>n>>k>>m;
        string s;
        cin>>s;

        int a[27]={0},cnt=0;
        string ans="";
        for(int i=0;s[i];i++)
        {
            if(!a[s[i]-97])cnt++;
            a[s[i]-97]=1;
            if(cnt==k)
            {
                ans+=s[i];
                cnt=0;
                memset(a,0,sizeof(a));
            }
        }
        if(ans.size()>=n)puts("YES");
        else
        {
            puts("NO");
            for(int i=0;i<k;i++)
            {
                if(!a[i])
                {
                    while(ans.size()<n)ans+=('a'+i);
                }
            }
            cout<<ans<<endl;
        }
    }
    return 0;
}

posted @   纯粹的  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示