有一个样例re过不了

P1088 [NOIP2004 普及组] 火星人

有个点要用快速读写,不能用Scanner
by zazhiii @ 2024-02-04 17:42:54


@[zazhiii](/user/911155) 改了之后,提交显示超时,请问怎么解决?```java import java.io.*; // 1:无需package // 2: 类名必须Main, 不可修改 public class Main { static int n,m; static int a[];//记录方案 static boolean visited[];//访问节点 static int res=0; static int mars[]; static boolean flag=false; public static void main(String[] args) throws IOException { StreamTokenizer st=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); st.nextToken(); n=(int)st.nval; st.nextToken(); m=(int)st.nval; int N=10010; a=new int[N]; mars=new int[N]; visited=new boolean[N]; for(int i=1;i<=n;i++) { st.nextToken(); mars[i]=(int)st.nval; } dfs(1); } static void dfs(int x){ if(flag) return; if(x>n){ res++; if(res==m+1){ flag=true; for(int i=1;i<=n;i++){ System.out.print(a[i]+" "); } } return; } for(int i=1;i<=n;i++){ if(res==0) { i=mars[x]; } if(!visited[i]){ visited[i]=true; a[x]=i; dfs(x+1); visited[i]=false; a[x]=0; } } } } ```
by cbwjl @ 2024-02-05 16:02:43


@[cbwjl](/user/1279245) 那就可能是你算法的问题了,不能把所有的排列都求出来,那样会超时。求起始排列到目标排列就行了,前后的排列尽可能都跳过。我是这样思考的,全部通过了。其中第二个数据点我没有用快读就超时了。
by zazhiii @ 2024-02-05 19:57:00


@[cbwjl](/user/1279245) 哦补充一点,你只用了快读,用`PrintWriter`类输出数据也比`System.out.print()`快不少,也可能是这个问题。
by zazhiii @ 2024-02-05 19:59:39


@[zazhiii](/user/911155) 谢谢大佬 我都没想过输出会有问题,各种输出方式都试了一遍,终于过了,太感谢了!!!
by cbwjl @ 2024-02-05 23:27:03


|