在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 模板 快速冪 取餘運算 矩陣快速冪總結 ...