日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(全排列)Smallest Difference (poj2718)

發布時間:2025/3/12 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (全排列)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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。