题目描述
现在有一些长度相等的 𝐷𝑁𝐴DNA 串(只由 ACGT
四个字母组成),请将它们按照逆序对的数量多少排序。
逆序对指的是字符串𝐴A中的两个字符 𝐴𝑖Ai、𝐴𝑗Aj,具有 𝑖<𝑗i<j 且 𝐴𝑖>𝐴𝑗Ai>Aj 的性质。如字符串 ATCG
中,T
和 C
是一个逆序对,T
和 G
是另一个逆序对,这个字符串的逆序对数为 22。
输入格式
第 11 行:一个整数 𝑚m,𝑚(0<𝑛≤100)m(0<n≤100) 表示字符串数量;
第 22 至 𝑛+1n+1行:每行是一个长度不超过 100100 的字符串。
输出格式
按逆序对数从少到多输出字符串,逆序对数一样多的字符串按照输入的顺序输出。
样例输入
6
AACATGAAGG
TTTTGGCCAA
TTTGGCCAAA
GATCAGATTT
CCCGGGGGGA
ATCGATGCAT
样例输出
CCCGGGGGGA
AACATGAAGG
GATCAGATTT
ATCGATGCAT
TTTTGGCCAA
TTTGGCCAAA
代码
#include<bits/stdc++.h>
using namespace std;
struct s{
string s;
int sum,id;
};
s a[105];
int f(string s){
int len=s.size();
int ade=0;
for(int i=0;i<len;i++){
for(int j=i+1;j<len;j++){
if(s[i]>s[j]){
ade++;
}
}
}
return ade;
}
bool cmp(s x,s y){
if(x.sum!=y.sum) return x.sum<y.sum;
return x.id<y.id;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
string s1;
cin>>s1;
a[i]={s1,f(s1),i};
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
cout<<a[i].s<<endl;
}
return 0;
}