有个点要用快速读写,不能用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