【发布时间】:2014-07-30 05:14:37
【问题描述】:
我正在尝试解决来自澳大利亚信息学培训网站的Slicing Paradise。这个想法是您有一系列块(实际上是语句中的森林,以及我的代码中的land),并且每次删除一个块(或转换为度假村),这可能会增加或减少连续(森林)块的运行。我要计算历史上的最大运行次数。输入是块的数量 N,然后是 N 行,给出每个块的移除时间。时间是从 1 开始的连续整数。
我的代码运行良好(我认为),但对于一些较大的情况来说它太慢了。有人可以建议一个简单的快速工作解决方案,或者可以对我的进行任何改进以使其在 O(N) 中运行吗?
慢解
#include <cstdio>
FILE* infile;
FILE* outfile;
int N,c,j,l,best;
int main(){
infile=fopen("slicein.txt","r");
outfile=fopen("sliceout.txt","w");
fscanf(infile,"%d\n",&N);
int land[N+1];
int location[N+1];
for (int i=1;i<=N;i++){
fscanf(infile,"%d\n",&location[i]);
land[i]=0;
}
j=1;l=1;c=1;
for (int i=1;i<=N;i++){
if (location[i]==j){
land[i]=1;
if (land[i+1]!=1 && land[i-1]!=1 && i!=N && i!=1) c++;
else if (land[i-1]==1 && land[i+1]==1 && i!=N && i!=1) c--;
j++;
if (c>best) best=c;
i=0;
}
if (i==N && l!=N*N){
i=0;
}
else if (l==N*N) break;
l++;
}
fprintf(outfile,"%d\n",best);
fclose(infile);
fclose(outfile);
return 0;
}
【问题讨论】:
-
你的基准是什么,表明它“太慢了”?
-
不仔细看你的代码,运行起来好像是O(N),那为什么会太慢呢?
-
@Andreas 在线评委说太慢了。如果您阅读问题陈述中提到的“约束”,它会说 30% 的分数 Nimgur.com/j9lw95Q o_weisman 这不是 O(N)。它是 O(N^2)。看整数 l。我只有在达到 N^2 的值时才会中断。
-
您是否尝试过分析器来查看哪个位较慢?