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