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
版權聲明:本文為博主原創文章,未經博主允許不得轉載。