zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    第一次软工作业
    项目复审&事后诸葛亮分析
    测试与发布
    团队项目scrum冲刺日志合集
    团队作业3
    团队作业2
    团队作业1-团队展示&选题
    结对项目, 四则运算
    个人项目作业
    自我介绍+软工五问
  • 原文地址:https://www.cnblogs.com/kickit/p/7921303.html
Copyright © 2011-2022 走看看