一直在尝试用英文写题解,但是我发现我的英语水平还达不到能把问题说清楚的水平,所以还是改回中文吧……
这是一道比较水的题,但是同样需要注意下。
这道题的题意是给一组一个N位数的多个不同的排列所构成的数,然后让我们每次对所有的数进行数位交换,找出所有交换中最大值和最小值的差最小的一次,并且将这个差输出。
提议很简短,我们首先想到如何对所有的数进行排列,其实根本不用,我们可以先生成一个次序数组,然后对这个数组进行全排列,之后重新生成数字就行了。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int a[101][101];
int n,k;
int pos[101];
int main()
{
cin>>n>>k;
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=k;j++)
{
char c;
cin>>c;
a[i][j] = c - '0';
}
}
for(int i = 1;i<=k;i++)
{
pos[i] = i;
}
int ans = 2009000999;
do
{
int mn = 2009000999,mx = -2009000999;
for(int i =1;i<=n;i++)
{
int temp = 0;
for(int j =1;j<=k;j++)
{
temp =temp *10 + a[i][pos[j]];
}
//cout<<temp<<endl;
mx = max(mx,temp);
mn = min(mn,temp);
}
ans = min(ans,mx - mn);
}while(next_permutation(pos+1,pos+1+k));
cout<<ans<<endl;
return 0;
}