POJ 2718 搜尋 思維

2021-07-27 01:21:35 字數 1305 閱讀 8059

一道思維細節題,沒有什麼難點。這種題想到就行,沒想到錯誤找一輩子.../(ㄒoㄒ)/~~

poj 2718:

題意: 給出最多10個不重複的從小到大的個位數, 將它們任意組合為兩個數字,不能有前導0。

求出,所有排列中,兩個數的最小差值。

網上很多人都是用new_permution還是什麼的stl裡的取排列辦法直接爆搜。沒有嘗試也不想嘗試。

我的心理程序是:

兩個數的要是差最小,那麼他們的最高位肯定是給出的數字中相鄰的兩個數字。乙個為小,乙個為大。

然後,高位較小的數字,後面放最大的數,依次放下去。

低位較大的數字,後面放最小的數,依次放下去。

那麼它們的差就是最小的。

比如說:   0 1 2 3 4 5

那麼最小差值肯定在這幾個數字之中。

154      203

254      301

352      401

432      501

而答案也正是 254 301。

模擬一遍後wa了。想起來沒考慮數字為奇數個時。

於是新增上,當個數為奇數個時,剩下的那個數給小的數字加上。然後求差值

即  01 2 3 4 5 6  

就變為了    2654 301

模擬一遍後wa了。 發現這思路根本就是錯的啊!

因為此時,最小的應該是  1023 654

也就是,左邊為最小的四位數,右邊為最大的三位數。

終於開開心心的模擬完。交了一發,wa了...

要砸電腦了但是後來發現是細節上,n寫成len了.....

總結一下: 思路就是分為,輸入的數字個數為奇數還是偶數。

若為奇數,則最小差為     最小多位數-最大低位數

若為偶數,則搜尋任意兩位相鄰位為最高最低位,把數字填進去,搜尋最小解

還要分類討論一下,如果只有兩個數字,就輸出他們的差即可。

#include"cstdio"

#include"cstring"

#include"queue"

#include"cmath"

#include"iostream"

#include"algorithm"

using namespace std;

#define inf 999999999

#define loop(x,y,z) for(x=y;x=i;j--)

r=r*10+pos[j];

ans=min(ans,l-r);

}int main()

return 0;

}

POJ 2718 窮竭搜尋

給一串大於0且小於9的數字,將其分成兩串數字且差值最小。長度大於0的數字不能以0開始。兩個子串長度相同或相差1時它們的差值最小。使用next permutation生成全排列後,用前一半的數字減後一半的數字取絕對值。include include include include define max...

poj2718(子集生成)

translation 給出一組數,用這一組數字的兩個不相交的子集組成兩個數。求兩個數差的絕對值的最小值。solution 生成所有可能的子集 可以用庫函式,也可以用bitset寫。這裡直接用next permutation生成所有的可能排列 再從中間切割,用前後兩個數相減的值依次更新ans值即可。...

POJ2718 遞迴套遞迴

就是給你乙個數,排列組合,然後問如何排列之間的差值最小。我之前的想法是乙個遞迴,然後兩個for迴圈列舉l1和l2,結果tle了,然後想了一下剪枝發現沒辦法剪,然後看了一下別人的 用了next permutation函式,雖然表示在書上看到過,但是具體確實沒有用過,看到別人用了,雖然我也想用一下,但是...