POJ 1007

来源:互联网 发布:apache主目录配置文件 编辑:程序博客网 时间:2024/06/07 05:24

原题网址:http://poj.org/problem?id=1007

题目大意:

输入n,m

m代表一共有m个字符串,n代表每个字符串含有n个字符。要求将这m个字符串按其逆序数从小到大排序,逆序数相同的字符串按其输入先后顺序排序。

比如DAABEC的逆序数是5,因为D大于后面的2个A  1个B  1个C,E大于后面的1个C,所以逆序数=2+1+1+1=5.


我的解题思路:

①用结构体存放所有数据
typedef struct{
char str[MAX];//MAX=110
int num;//每个字符串的逆序数
int sno;//每个字符串的序号
}DNA
DNA dna[MAX];
②利用qsort()快排,先按逆序数不同的从小到大排,如果逆序数相等则按每个字符串的序号从小到大排


源码如下:

#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX 110typedef struct{    char str[MAX];    int num;//每个字符串的逆序数    int sno;//每个字符串的序号}DNA;DNA dna[MAX];int compare(const void *a,const void *b){    DNA c=*(DNA *)a;    DNA d=*(DNA *)b;    if(c.num!=d.num)    {        return c.num-d.num;    }    else    {        return c.sno-d.sno;    }}int main(){    int n,m;//n代表每个字符串的长度,m代表一共有m个字符串    int i;    int j;    int k;    int sum;    while(scanf("%d%d",&n,&m)!=EOF)    {        for(i=0;i<m;i++)        {            getchar();            sum=0;            for(j=0;j<n;j++)            {                scanf("%c",&dna[i].str[j]);            }            for(j=0;j<n;j++)            {                for(k=j;k<n;k++)                {                    if(dna[i].str[j]>dna[i].str[k])                    {                        sum++;                    }                }            }            dna[i].num=sum;            dna[i].sno=i;        }        qsort(dna,m,sizeof(dna[0]),compare);        for(i=0;i<m;i++)        {            puts(dna[i].str);        }    }    return 0;}


0 0
原创粉丝点击