35行代碼AC——習題3-7 DNA序列(UVa-1368)_解題報告

勵志用盡量少的代碼做高效表達。


題目(提交)鏈接→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;
 } 

日拱一卒,功不唐捐。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章