(全排列)Smallest Difference (poj2718)
生活随笔
收集整理的這篇文章主要介紹了
(全排列)Smallest Difference (poj2718)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:
Description - 題目描述
給定若干位十進制數,你可以通過選擇一個非空子集并以某種順序構建一個數。剩余元素可以用相同規則構建第二個數。除非構造的數恰好為0,否則不能以0打頭。
舉例來說,給定數字0,1,2,4,6與7,你可以寫出10和2467。當然寫法多樣:210和764,204和176,等等。最后一對數差的絕對值為28,實際上沒有其他對擁有更小的差。
Input - 輸入
輸入第一行的數表示隨后測試用例的數量。
對于每組測試用例,有一行至少兩個不超過10的十進制數字。(十進制數字為0,1,…,9)每行輸入中均無重復的數字。數字為升序給出,相隔恰好一個空格。
Output - 輸出
對于每組測試用例,輸出一個以上述規則可獲得的最小的差的絕對值在一行。
Sample Input - 輸入樣例
1
0 1 2 4 6 7
Sample Output - 輸出樣例
28
分析與解答:
就是利用next_permutation這個函數生成這組數的全排列,然后把全排列分開看,每個組成一組數,而且a[0]和a[mid]都不為零,這是因為兩組數的第一個位置上的數數不是零。
只需判斷那兩組數形成的數的差是不是最小的,最后輸出那個最小值即可
參考代碼:
#include<bits/stdc++.h> using namespace std; char aa[20]; int a[20]; int cnt, mid, ans; int main() {int t;scanf("%d", &t);getchar();while(t--){cnt = 0;int t;while((t = getchar()) != '\n'){if(t != ' '){aa[cnt] = t;cnt++;}}int mid = cnt/2;ans = 1e9;if(cnt == 2){printf("%d\n",aa[1]-aa[0]);continue;}for(int i = 0; i < cnt; i++){a[i] = aa[i] - '0';}while(a[0] ==0)next_permutation(a,a+cnt);//第一組數的第一個數不能為0do{if(a[mid])//第二組數的第一個數不能為0 {int t1=0,t2=0;for(int i=0;i<mid;++i)t1=t1*10+a[i];for(int i=mid;i<cnt;++i)t2=t2*10+a[i];ans=min(ans,abs(t1-t2));}}while(next_permutation(a,a+cnt));printf("%d\n",ans);} }總結
以上是生活随笔為你收集整理的(全排列)Smallest Difference (poj2718)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据生态mysql_数据生态:MySQL
- 下一篇: 拉普拉斯变换_拉普拉斯变换——奇妙的数学