本文主要是介绍hdu6351(暴力+技巧)---2018多校5,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Beautiful Now
题目传送门
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <cmath>
#include <algorithm>
#include <functional>
#define inf 1000000000
using namespace std;
typedef long long ll;
const int MAXN=1e9+10;
const int MAX=1e3+10;
const double eps=1e-6;
const double PI=3.14159;char str[15];
int len,k;
int num[20];
int vis[20];
std::vector<int> per[10][10];void init(){//预处理每个长度全排列的序列变换需要op次数for(int i=1;i<=9;i++){for(int j=1;j<=i;num[j]=j;do{memset(vis,0,sizeof(vis));int num_t=0,cnt=0;for(int j=1;j<=i;j++)num_t=num_t*10+num[j];//储存序列变换的位置for(int j=1;j<=i;j++){if(vis[j]!=num_t){for(int k=num[j];k!=j;k=num[k]){vis[k]=num_t;//标记环,环内数字需要环长-1次opcnt++;}}}per[i][cnt].push_back(num_t);}while(next_permutation(num + 1, num + i + 1));}
}int get(int number){int res=0;int temp=1;while(number){res+=temp*num[number%10];number/=10;temp*=10;}return res;
}int main(){#ifdef ONLINE_JUDGE#elsefreopen("in.txt","r",stdin);//freopen("output.txt","w",stdout);#endifint T;cin>>T;init();while(T--){scanf("%s%d",str,&k);len=strlen(str);if(len==10){ //只预处理了9位cout<<1000000000<<" "<<1000000000<<endl;continue;}for(int i=0;i<len;i++)num[i+1]=str[i]-'0';if(k>=len)//len-1就可以使序列有序k=len-1;int maxx=0;int minn=1000000000;int res=1;for(int i=1;i<len;i++)res=res*10;for(int i=0;i<=k;i++){for(std::vector<int>::iterator it=per[len][i].begin();it!=per[len][i].end();it++){int num_t=get(*it);//cout<<" "<<num_t<<endl;if(num_t<res) continue;//有前导零maxx=max(maxx,num_t);minn=min(minn,num_t);}}cout<<minn<<" "<<maxx<<endl;}return 0;
}
这篇关于hdu6351(暴力+技巧)---2018多校5的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!