1.题目描述:点击打开链接
2.解题思路:本题利用暴力搜索法解决。因为数据规模比较小,可以直接利用next_permutation函数枚举所有排列。根据经验知,当两个数的位数差不多时,差值可能达到最下。因此枚举完分两种情况分别计算差值并取较小者。(1)[0,cnt/2)和[cnt/2,cnt)。(2)[0,cnt/2+1)和[cnt/2+1,cnt)。其中cnt是数组的长度。考虑第二种情况是因为有0的存在。
3.代码:
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<algorithm> #include<string> #include<sstream> #include<set> #include<vector> #include<stack> #include<map> #include<queue> #include<deque> #include<cstdlib> #include<cstdio> #include<cstring> #include<cmath> #include<ctime> #include<functional> using namespace std; #define N 20 int digit[N]; #define INF 100000000 int ans; int cal(int s, int e) { int res = 0; for (int i = s; i < e; i++) { if (digit[s] == 0)break; res = 10 * res + digit[i]; } return res == 0 ? INF : res; } int main() { //freopen("t.txt", "r", stdin); int T; scanf("%d ", &T); while (T--) { string str; getline(cin, str); stringstream ss(str); ans = INF; int x, y, cnt = 0; while (ss >> x) digit[cnt++] = x; if (cnt == 2)ans = abs(digit[0] - digit[1]); else { do { x = cal(0, cnt >> 1); y = cal(cnt >> 1, cnt); if (x != INF&&y != INF)ans = min(ans, abs(x - y)); x = cal(0, (cnt >> 1) + 1); y = cal((cnt >> 1) + 1, cnt); if (x != INF&&y != INF)ans = min(ans, abs(x - y)); } while (next_permutation(digit, digit + cnt)); } cout << ans << endl; } return 0; }
时间: 2024-10-31 08:30:34