标签:
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;
}
标签:
原文地址:http://www.cnblogs.com/565261641-fzh/p/5384544.html