题目就是整行读入空格间隔的一组字符串,然后第一个字符串为匹配串,题意就是让根据后面的字符串和第一个字符串的最小编辑距离排序,不过麻烦的是这是一个带权编辑距离,普通的最小编辑距离所有操作权值为1,所以稍微修改一下就可以了,看代码其实思路还是挺清晰的
PS. 其实用python写起来超简单的,代码就不贴了
#include<algorithm>
#include<iostream>
#include<string>
#include<map>
using namespace std;
map<char, int>mp;
string x, num[1005];
int len, vis[1005][1005];
void init() {
mp['q'] = mp['w'] = mp['e'] = mp['r'] = mp['t'] = 1;
mp['a'] = mp['s'] = mp['d'] = mp['f'] = mp['g'] = 1;
mp['z'] = mp['x'] = mp['c'] = mp['v'] = 1;
}
int ld(string x, string y) {
memset(vis, 0x3f3f3f3f, sizeof(vis));
vis[0][0] = 0;
for (int a = 0; a < x.size(); a++)
vis[a + 1][0] = (a + 1) * 3;
for (int b = 0; b < y.size(); b++)
vis[0][b + 1] = (b + 1) * 3;
for(int a=0;a<x.size();a++)
for (int b = 0; b < y.size(); b++) {
if (x[a] == y[b])
vis[a + 1][b + 1] = min(vis[a + 1][b + 1], vis[a][b]);
else
vis[a + 1][b + 1] = min(vis[a + 1][b + 1], vis[a][b] + 1 + abs(mp[x[a]] - mp[y[b]]));
vis[a + 1][b + 1] = min(vis[a + 1][b + 1], vis[a][b + 1] + 3);
vis[a + 1][b + 1] = min(vis[a + 1][b + 1], vis[a + 1][b] + 3);
}
return vis[x.size()][y.size()];
}
int cmp(string x, string y) {
return ld(x,num[0]) < ld(y,num[0]);
}
int main() {
init();
while (getline(cin, x)) {
len = 0;
string y="";
for (int a = 0; a < x.size(); a++)
if (x[a] != ' ')
y += x[a];
else if (y != "")
num[len++] = y, y = "";
if (y != "")
num[len++] = y, y = "";
sort(num+1, num + len, cmp);
cout << num[1] << " " << num[2] << " " << num[3] << endl;
}
return 0;
}