杭电2018多校第五场(2018 Multi-University Training Contest 5) 1002.Beautiful Now (HDU6351) -暴力、全排列、思维 [算法]——全排列(Permutation)以及next_permutation

2018 Multi-University Training Contest 5

6351.Beautiful Now

题意就是交换任意两个数字,问你交换k次之后的最小值和最大值。

官方题解:

哇塞,C++竟然自带全排列的函数,头文件为#include<algorithm>

全排列 next_permutation() 函数。随便传送两篇博客: 

1. [算法]——全排列(Permutation)以及next_permutation

代码:

 1 //1002-6351-暴力、全排列、思维
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<bitset>
 7 #include<cassert>
 8 #include<cctype>
 9 #include<cmath>
10 #include<cstdlib>
11 #include<ctime>
12 #include<deque>
13 #include<iomanip>
14 #include<list>
15 #include<map>
16 #include<queue>
17 #include<set>
18 #include<stack>
19 #include<vector>
20 using namespace std;
21 typedef long long ll;
22 
23 const double PI=acos(-1.0);
24 const double eps=1e-6;
25 const ll mod=1e9+7;
26 const int inf=0x3f3f3f3f;
27 const int maxn=1e5+10;
28 #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
29 
30 int a[15],b[15],vis[15],n;//b用来存下标,vis用来标记
31 int k;//输入的交换次数
32 
33 int solve()
34 {
35     memset(vis,0,sizeof(vis));
36     int num=0;
37     for(int i=0;i<n;i++){
38         if(vis[i]==0){
39             int t=0;
40             while(vis[i]==0){
41                 vis[i]=1;
42                 t++;//t代表跟第i个数交换有关的数一共有几个
43                 i=b[i];//将下标指向跟它进行交换的数的下标,即判断跟它交换的数是否还与其他的数进行了交换
44             }
45             num+=t-1;//用来记录交换次数
46         }
47         if(num>k) return 0;
48     }
49     return num;//返回交换次数
50 }
51 
52 char s[20];
53 
54 int main()
55 {
56     int t;
57     scanf("%d",&t);
58     while(t--){
59         scanf("%s%d",s,&k);//用字符串来存输入的数
60         n=strlen(s);
61         ll ret=0,maxx,minn;
62         for(int i=0;i<n;i++){
63             a[i]=s[i]-'0';
64             b[i]=i;
65             ret=ret*10+a[i];
66         }
67         maxx=minn=ret;
68         while(next_permutation(b,b+n)){//注意是下标全排列
69             if(a[b[0]]!=0&&solve()!=0){//全排列所组合的这个数不能是前导0并且要找交换k次的情况
70                 ll sum=0;
71                 for(int i=0;i<n;i++)
72                     sum=sum*10+a[b[i]];
73                 maxx=max(maxx,sum);
74                 minn=min(minn,sum);
75             }
76         }
77         printf("%lld %lld\n",minn,maxx);
78     }
79 }

溜了。。。

全排列 next_permutation() 函数。随便传送两篇博客: 

1. [算法]——全排列(Permutation)以及next_permutation

猜你喜欢

转载自www.cnblogs.com/ZERO-/p/9474681.html
今日推荐