题目链接。
分析:
最大的敌人果然不是别人,就是她(英语)。
每种代表车型的串,他们的distance就是串中不同字符的个数,要求算出所有串的distance's 最小 sum。
AC代码如下:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; const int maxn = 2200; const int INF = (1<<29); char s[maxn][10]; unsigned short G[maxn][maxn]; bool vis[maxn]; int d[maxn], n; int dis(int i, int j) { char *p1 = *(s+i), *p2 = *(s+j); int cnt = 0; while(*p1 && *p2) { if(*p1++ != *p2++) cnt++; } return cnt; } int prim(int s) { int ans = 0; memset(vis, false, sizeof(vis)); for(int i=0; i<n; i++) d[i] = G[s][i]; d[s] = 0; vis[s] = true; for(int i=0; i<n-1; i++) { int x, m = INF; for(int y=0; y<n; y++) if(!vis[y] && m >= d[y]) m = d[x=y]; ans += m; vis[x] = true; for(int y=0; y<n; y++) if(!vis[y] && d[y] > G[x][y]) d[y] = G[x][y]; } return ans; } int main() { while(scanf("%d", &n) == 1 && n != 0) { for(int i=0; i<n; i++) { scanf("%s", s[i]); } for(int i=0; i<n; i++) { G[i][i] = 0; for(int j=0; j<i; j++) { G[i][j] = G[j][i] = dis(i, j); } } int ans = prim(0); printf("The highest possible quality is 1/%d. ", ans); } return 0; }