uvalive 3602 DNA Consensus String
https://vjudge.net/problem/UVALive-3602
题意:
给定m个长度均为n的DNA序列,求一个DNA序列,使得它到所有的DNA序列的汉明距离最短,若有多个解则输出字典序最小的解。
ps:汉明距离指的是两个等长字符串中字符不同的位置的个数。
思路:
贪心原则,记录每一个位置上哪个字母出现的次数最多,如果有相同的就取字典序最小的那个,然后放进答案就可以了。
代码:
1 #include <iostream> 2 #include <string> 3 #include <algorithm> 4 #include <map> 5 using namespace std; 6 7 map<char,int> mmp[1005]; 8 9 struct node 10 { 11 char ch; 12 int sum; 13 } c[5]; 14 15 bool cmp(node aa,node bb) 16 { 17 if (aa.sum == bb.sum) return aa.ch < bb.ch; 18 19 return aa.sum > bb.sum; 20 } 21 22 int main() 23 { 24 int t; 25 26 cin >> t; 27 28 while (t--) 29 { 30 int m,n; 31 32 cin >> m >> n; 33 34 for (int i = 0;i < n;i++) mmp[i].clear(); 35 36 for (int i = 0;i < m;i++) 37 { 38 string a; 39 40 cin >> a; 41 42 for (int j = 0;j < n;j++) 43 mmp[j][a[j]]++; 44 } 45 46 string s; 47 48 int ans = 0; 49 50 for (int i = 0;i < n;i++) 51 { 52 int cnt = 0; 53 54 if (mmp[i]['A']) 55 { 56 c[cnt].ch = 'A'; 57 c[cnt].sum = mmp[i]['A']; 58 cnt++; 59 } 60 61 if (mmp[i]['C']) 62 { 63 c[cnt].ch = 'C'; 64 c[cnt].sum = mmp[i]['C']; 65 cnt++; 66 } 67 68 if (mmp[i]['G']) 69 { 70 c[cnt].ch = 'G'; 71 c[cnt].sum = mmp[i]['G']; 72 cnt++; 73 } 74 75 if (mmp[i]['T']) 76 { 77 c[cnt].ch = 'T'; 78 c[cnt].sum = mmp[i]['T']; 79 cnt++; 80 } 81 82 sort(c,c+cnt,cmp); 83 84 s.push_back(c[0].ch); 85 86 int tmp = 0; 87 88 for (int j = 0;j < cnt;j++) 89 tmp += c[j].sum; 90 91 ans += (tmp - c[0].sum); 92 } 93 94 cout << s << endl << ans << endl; 95 } 96 97 return 0; 98 }
康复训练中~欢迎交流!