30分求助!

P1088 [NOIP2004 普及组] 火星人

@[tang_mx](/user/515833) 这道题的思路有个坑,就是要求的并不是1..n这个序列的m+1号排列,而是原题目给出的序列的后m号排列
by LovelyTomato @ 2023-07-23 22:45:52


```cpp #include<iostream> #include<cstdio> #include<cstdlib> using namespace std; int n,m,a[10100],b[10100],cnt,flagg; bool flag[10100]; void dfs(int x){ if(flagg)exit(0); if(x==n+1){ cnt++; if(cnt==m+1){ for(int j=1;j<=n;j++) printf("%d ",a[j]); flagg++; } return ; } for(int i=1;i<=n;i++){ if(!cnt)i=a[x]; if(!flag[i]){ flag[i]=1; a[x]=i; dfs(x+1); flag[i]=0; } } } int main(){ // freopen("P1088_2.in","r",stdin); // freopen("ans.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)scanf("%d",&a[i]); dfs(1); return 0; } ``` @[tang_mx](/user/515833)
by LovelyTomato @ 2023-07-23 22:49:42


@[tang_mx](/user/515833) 代码其实很迷 看了半天(雾
by LovelyTomato @ 2023-07-23 22:50:12


@[LovelyTomato](/user/617088) 感谢!抱歉有一处很明显的错误我竟然没看出来QAQ
by tang_mx @ 2023-07-23 22:53:49


@[LovelyTomato](/user/617088) 其实我刚开始的代码问题不是很大的,但是做不出来看了眼题解就成了这种样子了QAQ
by tang_mx @ 2023-07-23 22:55:56


@[tang_mx](/user/515833) 其实STL有种很nt的做法 ``` #include <bits/stdc++.h> #define int long long using namespace std; int n,m,ans[10001]; inline int read(){ int X=0,w=0; char ch=0; while(!isdigit(ch)) {w|=ch=='-';ch=getchar();} while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar(); return w?-X:X; } inline void write(long long x){ if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10+'0'); } signed main(){ n=read(); m=read(); for (int i=1;i<=n;i++) ans[i]=read(); for (int i=1;i<=m;i++) next_permutation(ans+1,ans+1+n); for (int i=1;i<=n;i++) write(ans[i]),cout<<" "; } ```
by LovelyTomato @ 2023-07-23 22:59:00


@[LovelyTomato](/user/617088) 我知道的,但我在尝试训练我的基础能力,所以暂时不用STLφ(゜▽゜*)♪
by tang_mx @ 2023-07-23 23:08:21


你这个STL还是太逊了啊,有个更快的做法 ```cpp #include<bits/stdc++.h> using namespace std; int n,m,a[10005]; int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ cin>>a[i]; } for(int i=1;i<=m;i++){ next_permutation(a+1,a+n+1); } for(int i=1;i<=n;i++){ cout<<a[i]<<" "; } return 0; } ```
by JI_CI @ 2023-08-12 19:28:26


|