題目描述
伊娃喜歡從整個宇宙中收集硬幣。
有一天,她去了一家宇宙購物中心購物,結賬時可以使用各種硬幣付款。
但是,有乙個特殊的付款要求:每張帳單,她只能使用恰好兩個硬幣來準確的支付消費金額。
給定她擁有的所有硬幣的面額,請你幫她確定對於給定的金額,她是否可以找到兩個硬幣來支付。
輸入格式
第一行包含兩個整數 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所需的最小硬幣數目,或斷定不能找開。硬幣找零是比較經典的動態規劃問題,在某些面額組合的情況下,可以用貪心演算法求解。演算法導論 中將...