题目传送门
思路
总的来说这个题目就是 贪心
+
+
+ 排序。题目意思比较明确,这里将不再阐述。
首先,他要让我们在删去
k
k
k 个字符之后,留下的字母种类数尽量的小,也就是让删去的种类尽量的多。我们可以运用桶的思想,将每个字母的数量储存下来,为了让删去的种类越多,我们先根据这个字母的数量从小到大排序,然后每次都先删去数量越少的字母。因为这样的话,我们可以删去的
k
k
k 个字符才能利用到最大化,使得他能删去更多的字母种类。
代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
char a[100005];
int n,m;
struct node
{
int p,id;
bool operator <(const node &n)const
{
return p<n.p;
}
}arr[100005];
int vis[100005],cnt;
int ans;
int main()
{
cin>>a+1;
n=strlen(a+1);
cin>>m;
for(int i=1;i<=n;++i)
{
if(vis[a[i]]==0)
ans++,vis[a[i]]=++cnt;
arr[vis[a[i]]].p++;
arr[vis[a[i]]].id=a[i];
}
sort(arr+1,arr+cnt+1);
for(int i=1;i<=cnt;++i)
{
m-=arr[i].p;
if(m>=0)
ans--,arr[i].p=0;
else if(m<0)
{
break;
}
}
cout<<ans<<endl;
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;++i)
{
int q;
for(int j=1;j<=cnt;++j)
{
if(arr[j].id==a[i])
{
q=arr[j].p;
break;
}
}
for(int j=1;j<=min(1,q);++j)
cout<<a[i];
}
cout<<endl;
}
|