读书人

acm的题目解决办法

发布时间: 2012-02-05 12:07:15 作者: rapoo

acm的题目
poj 1007
Language:DefaultDNA Sorting
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 61135 Accepted: 24156

Description

One measure of ``unsortedness'' in a sequence is the number of pairs of entries that are out of order with respect to each other. For instance, in the letter sequence ``DAABEC'', this measure is 5, since D is greater than four letters to its right and E is greater than one letter to its right. This measure is called the number of inversions in the sequence. The sequence ``AACEDGG'' has only one inversion (E and D)---it is nearly sorted---while the sequence ``ZWQM'' has 6 inversions (it is as unsorted as can be---exactly the reverse of sorted).

You are responsible for cataloguing a sequence of DNA strings (sequences containing only the four letters A, C, G, and T). However, you want to catalog them, not in alphabetical order, but rather in order of ``sortedness'', from ``most sorted'' to ``least sorted''. All the strings are of the same length.

Input

The first line contains two integers: a positive integer n (0 < n <= 50) giving the length of the strings; and a positive integer m (0 < m <= 100) giving the number of strings. These are followed by m lines, each containing a string of length n.
Output

Output the list of input strings, arranged from ``most sorted'' to ``least sorted''. Since two strings can be equally sorted, then output them according to the orginal order.
Sample Input

10 6
AACATGAAGG
TTTTGGCCAA
TTTGGCCAAA
GATCAGATTT
CCCGGGGGGA
ATCGATGCAT
Sample Output

CCCGGGGGGA
AACATGAAGG
GATCAGATTT
ATCGATGCAT
TTTTGGCCAA
TTTGGCCAAA
Source


题目意思是说有一些字符串,这些字符串的字符不都是按先后顺序排的。这些字符串都对应一个值,这个值是倒序数的总和。例如:AACEDGG只有E和D是反的,所以这个值是1。GCA这个串的值就是3(GA、GC、CA都是反的)。
#include <stdio.h>
#include <string.h>
int Sum(char a[],int n)
{
int k,j,sum=0;
for (j=0;j<n;j++)
{
for (k=j+1;k<n;k++)
{
if (a[j]>a[k]) sum++;
}
}
return sum;
}
int main(int argc, char *argv[])
{
int n,m;
int i,j,t;
char a[50][110],c[110];
int b[50];
scanf("%d%d",&n,&m);
for (i=0;i<m;i++)
{
scanf("%s",a[i]);
b[i]=Sum(a[i],n); //求b[i]的值
}
//冒泡
for (i=0;i<n-1;i++)
for (j=0;j<n-1-i;j++)
{
if(b[j]>b[j+1])
{
t=b[j]; strcpy(c,a[j]);
b[j]=b[j+1]; strcpy(a[j],a[j+1]);
b[j+1]=t; strcpy(a[j+1],c); //若前个b[i]大的话就交换 连同字符窜一起交换
}
}
for (i=0;i<m;i++)
printf("%s\n",a[i]);
return 0;
}


为什么会有一个显示不出来 把数组c的大小改成10就可以了
谢谢大家


[解决办法]

C/C++ code
        for (i=0;i<m-1;i++)//排序的这个地方要用m,不是n    {        for (j=0;j<m-1-i;j++)          {            if(b[j]>b[j+1])            {                t=b[j]; strcpy(c,a[j]);                b[j]=b[j+1]; strcpy(a[j],a[j+1]);                   b[j+1]=t; strcpy(a[j+1],c);             }        }    }
[解决办法]
C/C++ code
#include <stdio.h>int Sum(char a[],int n){    int k,j,sum=0;    for (j=0;j<n;j++)    {        for (k=j+1;k<n;k++)        {            if (a[j]>a[k]) sum++;          }      }    return sum;}int main(){    int n,m;    int i,j,t;    char a[128][110],c[110]; //m 是 100以内,你开50肯定不够,n 是50内,倒是够了。    int b[128];    //交换地址,避免copy内存    char *pStrOutList[128];    char *tp;    scanf("%d %d",&n,&m);    for (i=0;i<m;i++)    {        scanf("%s", a[i]);           b[i] = Sum(a[i],n); //求b[i]的值           pStrOutList[i] = a[i];    }    // 冒泡    for (i=0;i<m;i++) //n 和 m 别搞混了        for (j=i + 1;j<m;j++)           {            if(b[i]>b[j])            {                t=b[i]; //strcpy(c,a[j]);                b[i]=b[j]; //strcpy(a[j],a[j+1]);                   b[j]=t; //strcpy(a[j+1],c); //若前个b[i]大的话就交换 连同字符窜一起交换                                   tp = pStrOutList[i];                pStrOutList[i] = pStrOutList[j];                pStrOutList[j] = tp;            }        }    for (i=0;i<m;i++)        printf("%s\n", pStrOutList[i]);    return 0;} 

读书人网 >C语言

热点推荐