POJ1833-排列
http://poj.org/problem?id=1833
自己先按着书上的思路写的,结果TLE我勒个去。。。
TLE代码:
#include<cstdio> #include<algorithm> using namespace std; int main(void) { int num[1024],m,n,i,j,k,un,_min,temp,t,flag; scanf("%d",&m); while(m--) { scanf("%d%d",&n,&k); for(i=0;i<n;i++) scanf("%d",&num[i]); flag=0; for(i=0;i<n-1;i++) if(num[i]<num[i+1]) { flag=1; break; } if(flag) { for(i=1;i<=k;i++) { _min=999; for(j=n-1;;j--) { if(num[j]>num[j-1]) { un=j-1; break; } } for(j=un;j<n;j++) { if(num[j]>num[un]&&num[j]<_min) { _min=num[j]; temp=j; } } t=num[un]; num[un]=num[temp]; num[temp]=t; sort(num+un+1,num+n); } for(j=0;j<n;j++) printf("%d ",num[j]); printf("\n"); } else { for(i=n-1;i>=0;i--) printf("%d ",num[i]); printf("\n"); } } return 0; }
然后度娘一下后发现了C++ STL中的next_permutation。。。。
就直接AC了,而且代码很短很精简
#include<cstdio> #include<algorithm> using namespace std; int main(void) { int num[1024],m,n,k,i; scanf("%d",&m); while(m--) { scanf("%d%d",&n,&k); for(i=0;i<n;i++) scanf("%d",&num[i]); while(k--) next_permutation(num,num+n); for(k=0;k<n;k++) printf("%d ",num[k]); printf("\n"); } return 0; }