DNA排序(C++) kkmd66

Description:

序列“未排序程度”的一个计算方式是元素乱序的元素对个数。例如:在序列’‘DAABEC’‘中,因为D>A,D>A,D>B,D>C,E>C,所以计算结果为5。这种计算方法称为序列的逆序数。序列’‘AACEDGG’‘逆序数为1(E>D)——近似排序,而序列’‘ZWQM’’ 逆序数为6(它是已排序序列(MQWZ)的反序,Z>W,Z>Q,Z>M,W>Q,W>M,Q>M)。所以逆序数越小,排序程度越高。

你的任务是分类DNA字符串(只有ACGT四种字符)。但是你分类它们的方法不是字典序,而是逆序数,排序程度从好到差。所有字符串长度相同。

Input:

输入包括多组数据,每组数据第一行为两个数:一个正整数n(0<n<=50)表示字符串长度,一个正整数m(0<m<=100)表示字符串个数。接下来m行,每行一个长度为n的字符串

Output:

对于每组数据,输出字符串列表,按排序程度从好到差。如果几个字符串逆序数相同,就按原来输入顺序输出。

Sample Input:

10 6
AACATGAAGG
TTTTGGCCAA
TTTGGCCAAA
GATCAGATTT
CCCGGGGGGA
ATCGATGCAT

Sample Output:

CCCGGGGGGA
AACATGAAGG
GATCAGATTT
ATCGATGCAT
TTTTGGCCAA
TTTGGCCAAA

#include <iostream>
#include <algorithm>
#include "vector"

using namespace std;

class arr {
public:
    string m_str;
    //输出次序
    int m_id;
    //逆序数
    int m_value;
};

/**
 * kkmd66
 * @param a1
 * @param a2
 * @return
 */

bool mCompare(const arr &a1, const arr &a2) {
    if (a1.m_value != a2.m_value)
        return a1.m_value < a2.m_value;
    else
        return a1.m_id < a2.m_id;
}

/**
 * kkmd66
 * @return
 */

int main() {

    int n, m;

    while (cin >> n >> m) {

        //存储
        vector<arr> vector(m);
        for (int i = 0; i < m; ++i) {
            cin >> vector[i].m_str;
            vector[i].m_id = i + 1;
        }

        //算逆序数
        for (int i = 0; i < m; ++i) {
            int count = 0;
            for (int j = 0; j < vector[i].m_str.size() - 1; ++j) {
                for (int k = j + 1; k < vector[i].m_str.size(); ++k) {
                    if (vector[i].m_str[j] > vector[i].m_str[k])
                        count++;
                }
            }
            vector[i].m_value = count;
        }

        //排序
        sort(vector.begin(), vector.end(), mCompare);

        //输出
        for (auto & i : vector) {
            cout << i.m_str << endl;
        }
    }

    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值