现在有一些长度相等的 DNA 串(只由 ACGT 四个字母组成),请将它们按照逆序对的数量多少排序。
逆序对指的是字符串A中的两个字符 A[i]、A[j],具有 i < j 且 A[i] > A[j] 的性质。如字符串 “ATCG” 中,T 和 C 是一个逆序对,T 和 G 是另一个逆序对,这个字符串的逆序对数为 22。
输入格式
第 11 行:两个整数 nn 和 mm,n(0<n≤50) 表示字符串长度,m(0<m≤100) 表示字符串数量;
第 22 至 m+1 行:每行是一个长度为 n 的字符串。
输出格式
按逆序对数从少到多输出字符串,逆序对数一样多的字符串按照输入的顺序输出。
输出时每行末尾的多余空格,不影响答案正确性
样例输入
10 6
AACATGAAGG
TTTTGGCCAA
TTTGGCCAAA
GATCAGATTT
CCCGGGGGGA
ATCGATGCAT
样例输出
CCCGGGGGGA
AACATGAAGG
GATCAGATTT
ATCGATGCAT
TTTTGGCCAA
TTTGGCCAAA
思路就是:字符串逐个字符向后搜索,如果发现在它前面的对数就加1,就是循环有点多,容易乱,自己理清楚就好。这道题真的感觉很头痛,然后大佬发现是cnt没有初始化的问题(运行结果是随机数),已经好几次没有初始化犯错了┭┮﹏┭┮,以后一定记着初始化。
#include<iostream>
#include<algorithm>
using namespace std;
struct node{
int num;//输入编号
int cnt;//逆序对的对数
string s;//存储字符串
};
bool cmp(node a,node b){
if(a.cnt==b.cnt)
return a.num<b.num;
else
return a.cnt<b.cnt;
}
int main(){
int m,n,i;
cin>>n>>m;
struct node a[m];
for(i=0;i<m;i++){
cin>>a[i].s;
a[i].cnt=0;//*初始化*
a[i].num=i+1;
}
for(i=0;i<m;i+