题目
简单的模拟。逆序对正向和反向数是相同的。

解法1

使用三个变量来记录前面位置出现过的字母次数。

#include<cstdio>
#include<cstring>
#include<string>
#include<map>
#include<cctype>
#include<iostream>
#include<algorithm>
using namespace std;

struct stu{
	char str[55];
	int cnt;
	int order;
}N[105];
bool cmp(stu a,stu b){
	if(a.cnt != b.cnt) return a.cnt<b.cnt;
	else return a.order<b.order; 
}
int main(){
	int m,n;
	scanf("%d%d",&m,&n);
	for(int i=0;i<n;i++){
		scanf("%s",N[i].str);
		int len=strlen(N[i].str);
		int cntc=0,cntg=0,cntt=0,cnt=0;
		for(int j=0;j<len;j++){
			if(N[i].str[j]=='T'){
				cntt++;
				continue;
			}else if(N[i].str[j]=='G'){
				cntg++;
				cnt+=cntt;
			}else if(N[i].str[j]=='C'){
				cntc++;
				cnt=cnt+cntt+cntg;
			}else{
				cnt=cnt+cntt+cntg+cntc;
			}
		}
		N[i].order=i;
		N[i].cnt=cnt;
	}
	sort(N,N+n,cmp);
	for(int i=0;i<n;i++){
		printf("%s\n",N[i].str);
	}
	return 0;
}

解法2

使用选择排序来计算逆序对,用一个数组存储。输出时每一轮比较逆序对的大小,直接将当前轮最小的逆序对输出。