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 }
View Code

版权声明:本文为博主原创文章,未经博主允许不得转载。

posted @ 2015-11-22 15:46  My_Sunshine  阅读(1761)  评论(0编辑  收藏  举报