題目連接:http://poj.org/problem?id=1833 html
題意說的很清楚,就是找出當前排列後的第k個排列。ios
很容易的,就能利用STL的next_permulation()函數寫出一個答案:函數
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; int data[1025]; int main(){ int n,k,m; scanf("%d",&m); while(m--) { scanf("%d%d",&n,&k); for(int i=0; i<n; i++) { scanf("%d",&data[i]); } while(k--) next_permutation(data,data+n); for(int i=0; i<n; i++) { printf("%d ",data[i]); } putchar('\n'); } return 0; }
然而提交上去,會提示超時...spa
有些摸不着頭腦,由於網上AC的代碼基本也都是調用k次next_permulation寫的。code
而後看到了這篇文章:Poj 1833 排列 —— 一道水題的凌亂htm
才明白,原來屢次調用printf函數也會超時。。blog
因而,就一次把它複製到輸出緩衝區吧。get
#include <iostream> #include <cstdio> #include <iterator> #include <algorithm> using namespace std; int data[1025]; int main() { int n,k,m; scanf("%d",&m); while(m--) { scanf("%d%d",&n,&k); for(int i=0; i<n; i++) { scanf("%d",&data[i]); } while(k--) next_permutation(data,data+n); copy(data,data+n-1,ostream_iterator<int>(cout," ")); cout<<data[n-1]<<endl; } return 0; }
這時就AC了,只用了500ms,說明調用printf至少消耗了500ms的時間。不過一樣的代碼,使用C++模式提交就跑了985ms,幾乎是壓線跑完。。it
Run ID User Problem Result Memory Time Language Code Length Submit Timeio
14813838 Arclabs001 1833 Accepted 696K 500MS G++ 477B 2015-10-14 17:41:22
14813836 Arclabs0011833Accepted204K985MSC++477B2015-10-14 17:40:55