Description
You are responsible for cataloguing a sequence of DNA strings (sequences containing only the four letters A, C, G, and T). However, you want to catalog them, not in alphabetical order, but rather in order of ``sortedness'', from ``most sorted'' to ``least sorted''. All the strings are of the same length.
Input
Output
Sample Input
10 6 AACATGAAGG TTTTGGCCAA TTTGGCCAAA GATCAGATTT CCCGGGGGGA ATCGATGCAT
Sample Output
CCCGGGGGGA AACATGAAGG GATCAGATTT ATCGATGCAT TTTTGGCCAA TTTGGCCAAA
大概意思就是求逆序數,然後按照逆序數從小到大排序。算是複習一下sort用法。
這裏因爲只有四個字母,所以求逆序數可以直接從後往前遍歷,遍歷過程中記錄這四個字母的個數,遍歷到某一個位置時,當前的逆序數就是比它小的字母的個數的總和。
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
struct strr
{
char a[55];
int s;
};
strr str[105];
int cmp(strr sa, strr sb)
{
return sa.s <= sb.s;
}
int reversion(char a[], int l)
{
int i, na = 0, nc = 0, nt = 0, ng = 0, sum = 0;
for(i = l - 1 ; i >= 0 ; i--)
{
switch(a[i])
{
case 'A' : na++; break;
case 'C' : nc++; sum += na; break;
case 'G': ng++; sum += na; sum += nc; break;
case 'T': nt++; sum += na ; sum += nc; sum += ng; break;
}
}
//printf("%d\n", sum);
return sum;
}
int main()
{
int n, i, l;
scanf("%d %d", &l, &n);
for(i = 0 ; i < n ; i++)
{
scanf("%s", str[i].a);
//str[i].s = reversion(str[i].a, l);
}
for(i = 0 ; i < n ; i++)
{
str[i].s = reversion(str[i].a, l);
}
sort(str, str + n, cmp);
for(i = 0 ; i < n ; i++)
printf("%s\n", str[i].a);
return 0;
}