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;
 } 

日拱一卒,功不唐捐。

猜你喜欢

转载自blog.csdn.net/weixin_43899069/article/details/106580184