题意:
有一个产品,可以执行press,repeat,deleltsymbol,给出一串字符,求生成这串字符所用的press功能的最小次数。
思路: 贪心。
所求数目字符串不同字符的总数,所求输出字符是输入字符按字典序排序输出
代码:
#include <iostream> #include <cstring> #include <cstdio> #include <cstdlib> #include <string> #include <algorithm> using namespace std; #define MAXN 102 struct Words{ char str[MAXN]; }; bool cmp(const Words &a,const Words &b){/*重载sort()函数的比较参数,使其对字符串进行排序*/ if(strcmp(a.str,b.str) > 0) return true; else return false; } class Nottoobad{ private: int wordNum; int ansNum; Words words[MAXN]; public: void init(); void process(); void output(); }; void Nottoobad::init(){ memset(words,0,sizeof(words)); ansNum = 0; } void Nottoobad::process(){ int cases; cin>>cases; while(cases--){ init(); cin>>wordNum; for(int i = 0;i < wordNum;i++){ cin >> words[i].str; } sort(words,words+wordNum,cmp); for(int i = 0;i < wordNum;i++){ int lens = strlen(words[i].str); int same = 0;//求相邻字符的最长相同长度。如果为0,相当于新键入。 while(words[i + 1].str[same] != 0&&(words[i].str[same] == words[i + 1].str[same])) same++; ansNum = ansNum + (lens - same);//统计不同字符总数 } output(); } } void Nottoobad::output(){ cout<< ansNum<<endl; for(int i = 0;i < wordNum;i++)//按排序之后的字符串输出 cout<<words[i].str<<endl; } int main() { // #ifndef ONLINE_JUDGE // freopen("D:\acm.txt","r",stdin); // #endif // ONLINE_JUDGE Nottoobad nottoobad; nottoobad.process(); return 0; }