分治法解決硬幣問題(二分法 三分法)(C 實現)

2021-08-31 18:24:27 字數 1417 閱讀 7995

在n(n≥3)枚硬幣中混有一枚不合格硬幣(重量過輕或過重未知),如果只有一架天平可以用來稱重且稱重硬幣數量沒有限制,設計乙個演算法找出這枚不合格硬幣,使得稱重次數最少。

二分法:

將這n個硬幣分成兩等份,然後放到天平的兩端,則假幣在較輕的那一端;

然後將較輕的那一端的硬幣再分成2等份,然後再放到天平的兩端進行比較,假幣還是在較輕的那一段;

直到最後只剩下兩個硬幣了,分別放到天平的兩端,輕的哪乙個就是假幣。

當然,最後也可能剩下3個硬幣,我們可以將這3個硬幣中任意拿出來乙個,然後將剩下的兩個放到天平的兩端,如果天平是平的,則說明拿出來的那個硬幣就是假幣;

如果天平不是平的,則輕的那一端是假幣。

**實現:(時間複雜度:o(log(2)(n))

#includeusing namespace std;

int sum(int a,int left,int right)

int findcorn(int a, int left, int right)

}int main()

; int left=0,right=0;

for(int i=1;a[i]!='\0';i++)

right++;

cout<三分法:

將n枚硬幣分成三組,前兩組有組硬幣,其餘的硬幣作為第三組;

將前兩組硬幣放到天平上,如果它們的重量相同,則假幣一定在第三組中,用同樣的方法對第三組進行處理;

如果前兩組的重量不同,則假幣一定在較輕的那一組中,用同樣的方法對較輕的那組硬幣進行處理。

**實現:(時間複雜度:o(log(3)(n)))

#includeusing namespace std;

int sum(int a,int left,int right)

int findcorn(int a,int left,int right)

int mid1=left+x-1;

int mid2=mid1+x;

if(sum(a,left,mid1)==sum(a,mid1+1,mid2))

return findcorn(a,mid2+1,right);

else if(sum(a,left,mid1) < sum(a,mid1+1,mid2))

return findcorn(a,left,mid1);

else

return findcorn(a,mid1+1,mid2);

}int main()

; int left=0,right=0;

for(int i=1;a[i]!='\0';i++)

right++;

cout

}

二分法與三分法

二分查詢基於分治策略的一種查詢方法,時間複雜度 o log 是用於解決單調有序問題,縮小問題規模 演算法步驟 演示 int binary search1 int num,int n,int x else return 1 二分問題模型 11110000問題 首先我們需要明確我們的目的是為了不斷縮小問...

二分三分法

x 待查詢的值,caculate 所要查詢的函式,這裡單調遞增。double low 區間下界 high 區間上界 mid while high low 1.0e 6 有區間下界left,區間上界right,mid為中點,midmid為靠近right的四等分點。即 mid left right 2 ...

ACM學習筆記(1)二分法 三分法

這裡是acm學習筆記 1 二分法 三分法。每次學習筆記都將會以思維導圖等多種靈活形式展示出來,這裡面的部落格和習題都是屬於精選,並且會不定時更新完善筆記。acm學習筆記 0 總綱要 二分法 一 二分法的基本思想 模板 整數快速冪 快速冪取模 模板題p1226 模板 快速冪 取餘運算 矩陣快速冪總結 ...