贪心刷题-001 Homework
解题思路:
我的想法是优先删除出现次数最少的字母,但也不知道错哪了,好像刷了又好像没刷,栓Q。希望有大佬可以帮忙指出错误,不胜感激。
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
struct abcde{
char a;
int num;
};
bool cmp(abcde x,abcde y){
return x.num<y.num;
}
int main(){
string str;
int k;
cin>>str>>k;
//初始化结构体,字母个数=0,字母赋予
abcde abc[26];
for(int i=0;i<26;i++){
abc[i].num=0;
abc[i].a=(char)(i+97);
}
//记录每个字母出现的字数
for(int i=0;i<26;i++){
int temp=(int)str[i]-97;
abc[temp].num++;
}
//对出现字母进行排序,出现次数少的排在前面
sort(abc,abc+26,cmp);
//删除k个字母
for(int i=0;i<26;i++){
if(k>0){
if(k>=abc[i].num){
k=k-abc[i].num;
abc[i].num=0;
}
else{
abc[i].num=abc[i].num-k;
k=0;
}
}
if(k==0) break;
}
//统计不同字母的个数
int sum=0;
for(int i=0;i<26;i++){
if(abc[i].num>0) sum++;
}
cout<<sum<<endl;
//给位置数组赋值
int sub[26];
for(int i=0;i<26;i++){
int temp=(int)abc[i].a;
temp=temp-97;
sub[temp]=abc[i].num;
}
//开始输出
for(int i=0;i<str.length();i++){
int temp=(int)str[i]-97;
if(sub[temp]>0){
cout<<str[i];
sub[temp]--;
}
}
return 0;
}