励志用尽量少的代码做高效表达。
题目(提交)链接→UVa-1368
思路:
DNA序列:按列遍历,记录每一列出现次数最多(若同样多,则字典序最小)的字母,录入s串累加。
距离:重新遍历,录入出现次数比最多次数少(若相等,则字典序较大的)的次数,录入sum累加
代码:
#include<bits/stdc++.h>
using namespace std;
int main() {
int n; cin >> n;
while(n--) {
int m, n; cin >> m >> n;
char c[m][n];
for(int i = 0; i < m; i++) //输入
for(int j = 0; j < n; j++)
cin >> c[i][j];
int mark; //mark+'0'记录出现次数最多且最小的字符
int found = 0; //记录出现次数最多的位数
int a[26];
string s;
int sum = 0;
memset(a,0,sizeof(a));
for(int i = 0; i < n; i++) { //i代表列
for(int j = 0; j < m; j++) //j代表行 ,先遍历行,将每行出现次数最多的字符找出,存入s串
a[(c[j][i]-'A')]++;
for(int k = 0; k < 26; k++) //求最短汉明序列的字符。
if((a[k] > found) || ((a[k] == found) && (mark > k))) { //出现次数最多或 一样多,但较小。
found = a[k];
mark = k;
}
for(int k = 0; k < 26; k++) //求次数
if((a[k] < found) || ((a[k] == found) && (mark < k))) sum+= a[k];
s += (mark+'A'); //将符合要求的字符录入s串
mark = 0; //置0环节
found = 0;
memset(a,0,sizeof(a));
}
cout << s << endl << sum << endl;
}
return 0;
}