acm的题目

Tdreamge 2012-01-18 10:11:48
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就可以了
谢谢大家
...全文
88 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
gqjjqg 2012-01-18
  • 打赏
  • 举报
回复
#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;
}


拿你的代码A了一把...
面包大师 2012-01-18
  • 打赏
  • 举报
回复

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);
}
}
}
面包大师 2012-01-18
  • 打赏
  • 举报
回复

for (i=0;i<n;i++)
{
memset(a[i], 0, 110);//这儿将字符串置空,省的有乱码
scanf("%s",a[i]);
b[i]=Sum(a[i],m);
}

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧