poj2718-Smallest Difference(枚举全排列)
一,题意:
给出最多10个数字,将它们划分为两个整数,求差值最小的值(除非只有一位数,否则不允许出现先导0)
很显然如果总共有n个数,必然有一个整数长n/2,另一个长n-n/2。
二,思路:
利用next_permutation()函数枚举数字的每个排列
三,步骤:
1,输入字符数组,并转换为整形数组;
2,利用next_permutation()函数,枚举数组的每一个排列,根据条件求出划分的两个整数的差值最小值。
1 #include<iostream>
2 #include<algorithm>
3 #include<cstring>
4 using namespace std;
5
6 int main() {
7 char s[1000]; //利用字符数组存储,是因为并不知道会输入几个数,那么我们就定义字符数组来存储输入一行的字符。
8 int t;
9 cin >> t;
10 getchar(); //这里getchar()是接收上面输入t后的回车符,若没有,则下面的gets_s()函数,就会接收回车符。
11 while (t--) {
12 int a[11], num = 0 , ans = 0x3f3f3f3f; //在通常的场合下,设置无穷大时,0x3f3f3f3f是一个非常棒的选择。如果想把int整形数组初始化为无穷大,我们只需要memset(a,0x3f,sizeof(a)).
13 gets_s(s); //VS2015使用的是新C标准,也就是C11,而VC6.0用的是老标准。在新标准中,用gets_s代替gets
14 for (int i = 0; i < strlen(s); i++) { //将字符数组转化为整形数组
15 if (s[i] >= '0'&&s[i] <= '9') {
16 a[num++] = s[i] - '0'; //a[]用来存储s[]转化得到的整形数组
17 }
18 }
19 sort(a, a + num);
20 do {
21 int num1 = 0, num2 = 0;
22 if (!a[0] || !a[num/2] && num>2) //前面那个数的首位不能是0 或者 后面那个数的首位也不能是0 , 还有当为输入是 10 时 ,要么前面那个数的是0, 要么后面的那个数是0,所以条件 num>2 加"||"前后都一样
23 continue;
24 for (int i = 0; i < num/2; i++) {
25 num1 = num1 * 10 + a[i]; //前一半数组的数,化为整数
26 }
27 for (int i = num / 2; i < num; i++) {
28 num2 = num2 * 10 + a[i]; //后一半数组的数,化为整数
29 }
30 ans = min(ans, abs(num1 - num2));
31 } while (next_permutation(a, a + num));
32 cout << ans << endl;
33 }
34 return 0;
35 }
版权声明:本文为博主原创文章,未经博主允许不得转载。