35行コードAC——練習問題3-7 DNA配列(UVa-1368)問題解決レポート


励ましはできるだけ少ないコードで効率的に表現します.
タイトル(提出)リンク→UVa-1368
考え方:
DNA配列:列ごとに遍歴し、各列の出現回数が最も多い(同じように多ければ辞書順が最も小さい)アルファベットを記録し、s列の累積を記録する.距離:再遍歴し、最多回数より少ない(等しい場合は辞書順が大きい)回数を入力し、sum累加を入力する
コード:
#include
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;
 } 

日拱一卒、功は唐に寄付しない.