每天演算法 找硬幣

2021-10-16 13:21:31 字數 1855 閱讀 3604

題目描述

伊娃喜歡從整個宇宙中收集硬幣。

有一天,她去了一家宇宙購物中心購物,結賬時可以使用各種硬幣付款。

但是,有乙個特殊的付款要求:每張帳單,她只能使用恰好兩個硬幣來準確的支付消費金額。

給定她擁有的所有硬幣的面額,請你幫她確定對於給定的金額,她是否可以找到兩個硬幣來支付。

輸入格式

第一行包含兩個整數 n 和 m,分別表示硬幣數量以及需要支付的金額。

第二行包含 n 個整數,表示每個硬幣的面額。

輸出格式

輸出一行,包含兩個整數 v1,v2,表示所選的兩個硬幣的面額,使得 v1≤v2 並且 v1+v2=m。

如果答案不唯一,則輸出 v1 最小的解。

如果無解,則輸出 no solution。

資料範圍

1≤n≤105,

1≤m≤1000

輸入樣例1:

8 15

1 2 8 7 2 4 11 15

輸出樣例1:

4 11

輸入樣例2:

7 14

1 8 7 2 4 11 15

輸出樣例2:

no solution

思路:利用雜湊表,我們將每個數值的數值和對應出現的次數繫結在一起,這樣從頭開始遍歷的時候,只要找到乙個數就去查表裡面的另乙個數存在不存在,只要存在了就輸出,因為題目規定先輸出最小解,所以我們要sort一下,雜湊表的查詢復炸度是o(1)的這個演算法是o(n);

注意特判:

**:

#include

#include

#include

using

namespace std;

int p[

100010];

intmain()

sort

(p,p+n)

;//排序一下

for(

int i=

0;i++i)

elseif(

(m-p[i]

!=p[i]

)&&s1[m-p[i]]!=

0)//另一種情況自己理解一下}}

cout<<

"no solution"

;return0;

}

雙指標(就是利用2個指標前後進行計算)

排序後使用雙指標。

左指 l 針指向陣列頭,右指標 r 指向陣列尾。

如果 a[l] + a[r] > m , 則 r 左移。//說明加大了,大數變小點

如果 a[l] + a[r] < m , 則 l 右移。說明變小了,小數變大點

如果 a[l] + a[r] = m , 則找到解。

如果指標相遇還沒有出現 a[l] + a[r] = m ,則無解。

時間複雜度:排序 o(nlogn),雙指標o(n),總時間複雜度 o(nlogn)。

**:

#include

#include

#include

using

namespace std;

int a[

100010];

intmain()

sort

(a,a+n)

;int l=

0,r=n-1;

while

(lelse

if(a[l]

+a[r]

else

if(a[l]

+a[r]

>m)

} cout<<

"no solution"

}

關於雙指標我的總結私聊找我要

找硬幣 雜湊表

伊娃喜歡從整個宇宙中幫小柏同學收集硬幣。有一天,她去了一家宇宙購物中心購物,結賬時可以使用各種硬幣付款。但是,有乙個特殊的付款要求 每張帳單,她只能使用恰好兩個硬幣來準確的支付消費金額。給定她擁有的所有硬幣的面額,請你幫她確定對於給定的金額,她是否可以找到兩個硬幣來支付。輸入格式 第一行包含兩個整數...

找硬幣問題 c 實現

題目見 演算法設計與分析基礎 p223 c 實現如下 using namespace std class solution f 0 0 matrix 0 0 for int j 1 j m j for int i 1 i n i return f 4 5 int max int a,int b in...

動態規劃 找硬幣問題

問題 有3,5,7分錢的硬幣,以及給定的數額n,求找開n所需的最小硬幣數目。擴充套件問題 有 v1,v2,v3,vm 硬幣面額,面額數目為m,以及給定的數額n,求找開n所需的最小硬幣數目,或斷定不能找開。硬幣找零是比較經典的動態規劃問題,在某些面額組合的情況下,可以用貪心演算法求解。演算法導論 中將...