您的位置:首页 > 其它

POJ 1007

2014-07-11 10:44 155 查看
原题网址: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 110

typedef 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: