ACM OJ 上一题目 总超时间限制 求解释

Napoleon_001 2013-04-06 12:47:08
先贴上 题目地址
http://icpc.ahu.edu.cn/OJ/Problem.aspx?id=515

代码
#include<stdio.h>
#include<string.h>
int main()
{
int N,n=0,i,j,k;
char in[10002][21],out[10002][21],tou[21],*p;
scanf("%d",&N);
getchar();
for(i=0;i<N;i++)
gets(in[i]);
gets(tou);
for(i=0;i<N;i++)
{
p=strstr(in[i],tou);
if(p==in[i])
{
n++;
if(n==1) strcpy(out[0],in[i]);
else
{
for(j=0;j<n-1;j++)
if(strcmp(in[i],out[j])<0) break;
for(k=n-1;k>=j+1;k--)
strcpy(out[k],out[k-1]);
strcpy(out[j],in[i]);
}
}
}
for(i=0;i<n;i++)
printf("%s\n",out[i]);
return 0;
}

OJ给的反应
Time Limit Exceeded
Extended Results: r+++++++++
哪儿耗用时间多了?
如果想用类似 数大小 的排序,那么与前缀无关的字符怎么弄?
还有 我的运行 结果正确吧
可以给我说一下 怎么弄
...全文
486 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sjjwind 2013-04-07
  • 打赏
  • 举报
回复
不能用N^2的排序,要用n*logn的排序,n^2就超时了,比如调用algorithm库里面的sort或者qsort快排进行排序。
Napoleon_001 2013-04-06
  • 打赏
  • 举报
回复
都睡了啊
Napoleon_001 2013-04-06
  • 打赏
  • 举报
回复
引用 3 楼 sjjwind 的回复:
先将所有数输入,然后找T开头的所有字符串,放到一个优先队列中,然后按照顺序取出来就可以了,复杂度O(n*logn)。 或者将所有数全部输入,然后对字符串排序,然后取出开头为T的所有字符串。
#include<stdio.h>
#include<string.h>
int main()
{
	int N,n=0,i,j,k;
	char in[10002][21],out[10002][21],temp[21],tou[21],*p;
	scanf("%d",&N);
	getchar();
	for(i=0;i<N;i++)
		gets(in[i]);
	gets(tou);
	for(i=0;i<N;i++)
	{
		p=strstr(in[i],tou);
		if(p==in[i])
		{
			strcpy(out[n],in[i]);
			n++;
		}
	}
	for(i=0;i<n-1;i++)
	{
		k=i;
		for(j=i+1;j<n;j++)
			if(strcmp(out[j],out[k])<0) k=j;
		if(k!=i)
		{
			strcpy(temp,out[k]);
			strcpy(out[k],out[i]);
			strcpy(out[i],temp);
		}
	}
	for(i=0;i<n;i++)
		printf("%s\n",out[i]);
	return 0;
}				
这个也是 不对
Napoleon_001 2013-04-06
  • 打赏
  • 举报
回复
引用 3 楼 sjjwind 的回复:
先将所有数输入,然后找T开头的所有字符串,放到一个优先队列中,然后按照顺序取出来就可以了,复杂度O(n*logn)。 或者将所有数全部输入,然后对字符串排序,然后取出开头为T的所有字符串。
#include<stdio.h>
#include<string.h>
int main()
{
	int N,n=0,i,j,k;
	char in[10002][21],temp[21],tou[21],*p;
	scanf("%d",&N);
	getchar();
	for(i=0;i<N;i++)
		gets(in[i]);
	gets(tou);
	for(i=0;i<N-1;i++)
	{
		k=i;
		for(j=i+1;j<N;j++)
			if(strcmp(in[j],in[k])<0) k=j;
		if(k!=i)
		{
			strcpy(temp,in[i]);
			strcpy(in[i],in[k]);
			strcpy(in[k],temp);
		}
	}
	for(i=0;i<N;i++)
	{
		p=strstr(in[i],tou);
		if(p==in[i])
			printf("%s\n",in[i]);
	}
	return 0;
}
是这个意思么 怎么还是不对呢
Napoleon_001 2013-04-06
  • 打赏
  • 举报
回复
现在大一,学的知识比较少,按顺序取出,还是进行排序后输出吧
sjjwind 2013-04-06
  • 打赏
  • 举报
回复
先将所有数输入,然后找T开头的所有字符串,放到一个优先队列中,然后按照顺序取出来就可以了,复杂度O(n*logn)。 或者将所有数全部输入,然后对字符串排序,然后取出开头为T的所有字符串。
FancyMouse 2013-04-06
  • 打赏
  • 举报
回复
N=10000你还用O(n^2)的算法,当然超时。

69,371

社区成员

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

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