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;
}