题目
简单的模拟。逆序对正向和反向数是相同的。
解法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
使用选择排序来计算逆序对,用一个数组存储。输出时每一轮比较逆序对的大小,直接将当前轮最小的逆序对输出。