题目大意:给你一个字符串,要求你选择若干个位置,使得任意相邻m个字符都至少有一个被选中,并且要求选中字符排序后的字典序列最小
一开始写了个单调队列DP,然后WA5发现并不具有局部最优推到全局最优的性质
洗澡的时候发现直接贪心就可以了。。洗完已经结束提交了
我们从a到z顺次枚举,如果加上当前的所有字符都无法满足条件,那么就全部加进去,否则看当前字母最少需要选择几个即可
最后统计当前字母的时候在满足条件的情况下尽量选择后面那个字母即可
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int a[300001],s[31];
int main()
{
int n;
scanf("%d",&n);
string x;
cin>>x;
int i,j,len=x.size();
for(i=0;i<len;i++)
{
a[i+1]=x[i]-'a';
s[a[i+1]]++;
}
int sum=0;
for(i=0;i<=25;i++)
{
int d=0;
for(j=1;j<=len;j++)
{
if(a[j]<=i)
d=0;
else
d++;
if(d==n)
break;
}
if(d!=n)
{
int d=0,la=0;
for(j=1;j<=len;j++)
{
if(a[j]<i)
d=0;
else
{
d++;
if(a[j]==i)
la=j;
}
if(d==n)
{
d=(j-la);
sum++;
}
}
break;
}
}
int ii;
for(ii=0;ii<i;ii++)
{
for(j=1;j<=s[ii];j++)
printf("%c",ii+'a');
}
for(j=1;j<=sum;j++)
printf("%c",ii+'a');
printf("\n");
return 0;
}