码迷,mamicode.com
首页 > 其他好文 > 详细

vijosP1115 火星人

时间:2015-10-13 09:08:37      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:

vijosP1115 火星人

 

链接:https://vijos.org/p/1115

 

【思路】

  排列组合。

  题目要求为求第下m个排列。

  这里有两种方法,首选的是调用algorithm中的next_permutation函数,其次就是手写生成函数。

 

【代码1】53ms

 

 1 #include<iostream> 
 2 #include<algorithm>
 3 using namespace std;
 4 const int maxn = 10000+10;
 5 int p[maxn];
 6 int n,m;
 7 
 8 int main() {
 9     ios::sync_with_stdio(false);
10     cin>>n>>m;
11     for(int i=0;i<n;i++) cin>>p[i];
12     
13     while(m--) next_permutation(p,p+n);
14     
15     for(int i=0;i<n;i++) cout<<p[i]<<" ";
16     
17     return 0;
18 }

 

【代码2】106ms

 

 1 #include<iostream> 
 2 #include<algorithm>
 3 using namespace std;
 4 const int maxn = 10000+10;
 5 int p[maxn];
 6 int n,m;
 7 
 8 bool get_permutation() {
 9     int i=n-1;
10     while(i>0 && p[i-1] >= p[i]) i--;
11     if(i==0) return false;
12     int mp=i;
13     for(int j=i+1;j<n;j++) {
14         if(p[j]<=p[i-1]) continue;
15         if(p[j]<p[mp]) mp=j;
16     }
17     swap(p[mp],p[i-1]);
18     sort(p+i,p+n);
19     return true;
20 }
21 
22 int main() {
23     ios::sync_with_stdio(false);
24     cin>>n>>m;
25     for(int i=0;i<n;i++) cin>>p[i];
26     
27     while(m--) get_permutation();
28     
29     for(int i=0;i<n;i++) cout<<p[i]<<" ";
30     
31     return 0;
32 }

 

vijosP1115 火星人

标签:

原文地址:http://www.cnblogs.com/lidaxin/p/4873421.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!