HDU 6351.Beautiful Now-暴力、全排列、思维 (2018 Multi-University Training Contest 5 1002)
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 }
溜了。。。