1007:DNA排序
- 总时间限制:
- 1000ms 内存限制:
- 65536kB
- 描述
-
现在有一些长度相等的DNA串(只由ACGT四个字母组成),请将它们按照逆序对的数量多少排序。逆序对指的是字符串A中的两个字符A[i]、A[j],具有i < j 且 A[i] > A[j] 的性质。如字符串”ATCG“中,T和C是一个逆序对,T和G是另一个逆序对,这个字符串的逆序对数为2。
输入 - 第1行:两个整数n和m,n(0<n<=50)表示字符串长度,m(0<m<=100)表示字符串数量
第2至m+1行:每行是一个长度为n的字符串 输出 - 按逆序对数从少到多输出字符串,逆序对数一样多的字符串按照输入的顺序输出。 样例输入
-
10 6 AACATGAAGG TTTTGGCCAA TTTGGCCAAA GATCAGATTT CCCGGGGGGA ATCGATGCAT
样例输出 -
CCCGGGGGGA AACATGAAGG GATCAGATTT ATCGATGCAT TTTTGGCCAA TTTGGCCAAA
由于刚刚写C++,自己用了三个小时写的代码还是有很多问题,而且过于“臃肿”, 还是转载一篇大神的代码吧···
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<assert.h>
#include<ctype.h>
#include<cstdlib>
#define MAX 10000
using namespace std;
struct tn{
char s[54];
int asc;
}d[105];
bool compare(tn a, tn b)
{
return a.asc < b.asc;
}
int main()
{
int i, j, k, n, m;
cin >> n >> m;
for (i = 0; i < m; i++)
{
cin >> d[i].s;
}
for (i = 0; i < m; i++)
{
d[i].asc = 0;
for (j = 0; j < n; j++)
{
for (k = j; k < n; k++)
{
if (d[i].s[k] < d[i].s[j])
d[i].asc++;
}
}
sort(d, d + m, compare);
for (i = 0; i < m; i++)
{
cout << d[i].s << endl;
}
}
return 0;
}