1007 DNA 排序
题目大意:
序列“未排序程度”的一个计算方式是元素乱序的元素对个数。例如:在单词序列“DAABEC‘”中,因为D大于右边四个单词,E大于C,所以计算结果为5。这种计算方法称为序列的逆序数。序列“AACEDGG”逆序数为1(E与D)——近似排序,而序列``ZWQM‘‘ 逆序数为6(它是已排序序列的反序)。
你的任务是分类DNA字符串(只有ACGT四个字符)。但是你分类它们的方法不是字典序,而是逆序数,排序程度从好到差。所有字符串长度相同。
输入:
第一行包含两个数:一个正整数n(0<n<=50)表示字符串长度,一个正整数m(0<m<=100)表示字符串个数。接下来m行,每行一个长度为n的字符串。
输出:
输出输入字符串列表,按排序程度从好到差。如果逆序数相同,就原来顺序输出。
样例输入:
10 6
AACATGAAGG
TTTTGGCCAA
TTTGGCCAAA
GATCAGATTT
CCCGGGGGGA
ATCGATGCAT
样例输出:
CCCGGGGGGA
AACATGAAGG
GATCAGATTT
ATCGATGCAT
TTTTGGCCAA
TTTGGCCAAA
#include<iostream> using namespace std; #include<stdio.h> #include<stdlib.h> #include<string.h> /*使用结构体存储字符串和对应的逆序数。 如果把字符串和逆序数分开,排序之后字符串和逆序数将会无法对应*/ struct String{ int numOfReverse; char chars[55]; }str[100]; /*qsort的cmp函数参数默认为:const void *p,const void *q;数据类型不能改变。在赋值之前要对指针进行强制类型转换。*/ int cmp(const void *p,const void *q){ String a = *(String *)p; String b = *(String *)q; return (a.numOfReverse - b.numOfReverse); } int calcNumOfReverse(char *s){ int i,j; int cnt = 0,leap = 1,sum = 0; for(i=0;i<strlen(s);i++){ for(j=i+1;j<strlen(s);j++){ if(s[j]<s[i]){ cnt++; } } sum += cnt; cnt = 0; } return sum; } int main(void){ int col,row; int i,j,k; scanf("%d %d",&col,&row); for(i=0;i<row;i++){ scanf("%s",str[i].chars);//数据输入 } for(i=0;i<row;i++){ str[i].numOfReverse = calcNumOfReverse(str[i].chars); } qsort(str,row,sizeof(str[0]),cmp); for(i=0;i<row;i++){ printf("%s\n",str[i].chars); } return 0; }
时间: 2024-10-13 02:05:43