前情提要
限于自身知识水平的储备不足,无法对这道题的贪心算法做出一个证明,待来日学识渐长把这个证明写下
题解
我们可以把字符串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;
}
标签:cnt,遍历,Did,cin,一位,Everything,int,ans,Covered
From: https://www.cnblogs.com/pure4knowledge/p/17993599