1.题目描述:点击打开链接
2.解题思路:根据题意描述,扫描每一列,统计这一列中各个字符出现的次数,同时维护最大的次数。由于是按照字典序最小输出,因此统计完次数后依次从前往后扫描26个字母中第一次出现该最大次数的字符,它就是最优解中的字符。
3.代码:
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<algorithm> #include<string> #include<sstream> #include<set> #include<vector> #include<stack> #include<map> #include<queue> #include<deque> #include<cstdlib> #include<cstdio> #include<cstring> #include<cmath> #include<ctime> #include<functional> using namespace std; #define N 50+5 #define M 1000+10 char dna[N][M]; int vis[26]; int m, n; int ans; string compare() { string str; for (int j = 0; j < n; j++) { int _max = 0; memset(vis, 0, sizeof(vis)); for (int i = 0; i < m; i++) { vis[dna[i][j] - 'A']++;//统计出现次数 _max = max(_max, vis[dna[i][j] - 'A']); } for (int k = 0; k < 26; k++)//从前往后扫描最优字符 if (vis[k] == _max){ str += 'A' + k; break; } ans += m - _max;//计算距离 } return str; } int main() { //freopen("t.txt", "r", stdin); int T; cin >> T; while (T--) { memset(dna, '\0', sizeof(dna)); ans = 0; scanf("%d%d", &m, &n); for (int i = 0; i < m; i++) scanf("%s", dna[i]); cout << compare() << endl; cout << ans << endl; } return 0; }
原文:http://blog.csdn.net/u014800748/article/details/44565843