UVA10602 Editor Nottoobad
2017年7月31日要求按最少步数输出所有字符串,给定的第一个字符串必须第一个打出,其它随意,系统有两种操作,一是复制前一个字符串,二是删除一个字符,这两种操作都不计算步数.
贪心,贪心的规则是输出与上一个字符串前缀相同且数量最多的一个字符串.挨个枚举每一个没访问过的字符串,看看哪个字符串与上一个输出的字符串前缀相同的字母数量最多,最多就把它输出.
#include <bits/stdc++.h>
using namespace std;
string in[105];
string ans[105];
int vis[105];
int main()
{
int t, n;
scanf("%d", &t);
while (t--) {
memset(vis, 0, sizeof(vis));
scanf("%d", &n);
int num = 0;
for (int i = 0; i < n; i++) {
cin >> in[i];
}
ans[num++] = in[0];
vis[0] = true;
int last = 0;
int res = in[0].size();
while (num != n) {
int pos = 0, mx = 0;
for (int j = 1; j < n; j++) {
if (vis[j])
continue;
if (!pos)
pos = j;
for (int k = 0; k < min(in[j].size(), in[last].size()); k++) {
if (in[j][k] != in[last][k]) {
break;
}
if (k + 1 > mx) {
mx = k + 1;
pos = j;
}
}
}
last = pos;
ans[num++] = in[pos];
vis[pos] = true;
res += in[pos].size() - mx;
}
cout << res << endl;
for (int i = 0; i < n; i++) {
cout << ans[i] << endl;
}
}
return 0;
}