勵志用盡量少的代碼做高效表達。
題目(提交)鏈接→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;
}