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 }

 

posted @ 2017-11-29 16:35  qrfkickit  阅读(263)  评论(0编辑  收藏  举报