题目:https://cn.vjudge.net/problem/CodeForces-124B
题意:给出n个k位数,将每个数字的各个位置上的数重新排列,让重排后的数字极差最小,求极差。
注:(1)数字可以有前导零。
(2)重排时,所有数字按照相同规则重新排列。
(3)1 ≤ n, k ≤ 8
思路:既然重排时所有数字规则都相同,那么我们只需要枚举全排列作为重排的规则,在计算出每种重排规则下的数字极差就好。
代码:C++
#include <cstdio>
#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
#include <string>
#include <queue>
#include <map>
#include <cstring>
#include <set>
#include <stack>
#include <cstdlib>
#include <bitset>
using namespace std;
const int maxn = 8 + 10;
const int INF = (int)1e9 + 10;
int n, m;
vector<int> per;
string vs[maxn];
int solve()
{
string s = vs[0];
int maxx = -INF, minn = INF;
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
s[j] = vs[i][per[j]];
}
int t = atoi(s.c_str());
maxx = max(maxx, t);
minn = min(minn, t);
}
return abs(maxx - minn);
}
int main()
{
cin >> n >> m;
for(int i = 0; i < n; i++)
{
cin >> vs[i];
}
for(int i = 0; i < m; i++)
{
per.push_back(i);
}
int ans = INF;
do
{
ans = min(ans, solve());
} while(next_permutation(per.begin(), per.end()));
cout << ans << endl;
return 0;
}