首页 > 代码库 > POJ1007

POJ1007

2014-08-22

 

题目意思:

按照各个字符串的逆序数排序(稳定排序,即若A=B,则AB的顺序还是原来的样子)

 

思路:


求出每个字符串的逆序数后,排序输出即可

 

代码:

 

//Memory Time // 352K  16MS #include <stdio.h>#include <stdlib.h>typedef struct Dna{    int num;    char sequence[50];}DNASQ;//计算逆序数int count(char sq[],int len){ int a,c,g,i; int count; a=c=g=0; for(i=len-1;i>=0;i--){    switch (sq[i]){    case A:        {            a++;            break;        }    case C:        {            c++;            count+=a;            break;        }    case G:        {            g++;            count=count+a+c;            break;        }    case T:    {        count=count+a+c+g;        break;    }    default:        break;    } } return count;}int partition(DNASQ sq[],int left,int right){    int i=left;    int j=right;    DNASQ temp=sq[i];    while(i!=j){        while(sq[j].num>=temp.num&&i<j)            j--;        while(sq[i].num<=temp.num&&i<j)            i++;        if(i<j)        {            DNASQ t;            t=sq[i];            sq[i]=sq[j];            sq[j]=t;        }    }    sq[left]=sq[i];    sq[i]=temp;    return i;}//快排void qSort(DNASQ sq[],int left,int right){    int dq=0;    if(left<right){        dq=partition(sq,left,right);        qSort(sq,left,dq-1);        qSort(sq,dq+1,right);    }}int main(){    DNASQ dnasq[100];    int n,m,i;    scanf("%d%d",&n,&m);    for(i=0;i<m;i++){        scanf("%s",dnasq[i].sequence);        dnasq[i].num=count(dnasq[i].sequence,n);    }    qSort(dnasq,0,m-1);    for(i=0;i<m;i++){        printf("%s\n",dnasq[i].sequence);    }    return 0;}

 PS:这题由于字符串中只含有AGCT四个字母,所以在求逆序数的时候可以直接计数就行了。

 

POJ1007