本文主要是介绍poj 2718,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
首先可以想到,这两个数必定是用各一半数量的数字组成的数,如给出6个数,把这6个数分为两组,每组3个,这样组成的数字的差必定比其他方式小。接下来的任务就是穷举所有可能出现的组合,并求出最小差。在这里可以使用STL的next_permutation函数来求给定这组数字的所有排列,并将其分为两组组成数字,然后记录最小差。需要注意第一个数位不能为0。
#include <iostream>
#include <algorithm>using namespace std;const int INF = 100000000;int n, i, ids, a[15];int num(int i, int j) {int x = 0;for(int k=i; k<j; k++) {x *= 10;x += a[k];}return x;
}void solve() {int ans = INF;int k = ids / 2;do {if(a[0] == 0 || a[k] == 0) continue;int x = num(0, k);int y = num(k, ids);ans = min(ans, abs(x - y));} while(next_permutation(a, a+ids));if(ids == 2)ans = abs(a[0] - a[1]);cout << ans << endl;
}int main() {scanf("%d", &n);for(getchar(); i<n; i++) {char c;ids = 0;while((c=getchar()) != '\n')if(c != ' ')a[ids++] = c - '0';solve();}return 0;
}
这篇关于poj 2718的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!