一道華為簡單演算法題記錄 汽水瓶

2021-09-10 01:55:41 字數 2567 閱讀 4257

今天公司同事提到了面試一位新人的時候提出的華為的一道題,感覺有點意思,記錄下吧。

假設一瓶汽水售價1元,3個瓶蓋可以換一瓶汽水,2個瓶子可以換一瓶汽水,問20元可以喝多少汽水。

看到這個題目,最直接的做法,就是寫個程式,模擬買汽水-換汽水的過程,直到剩餘的瓶蓋或者瓶體買不到汽水。

然而這樣寫似乎有點太麻煩了,依稀記得這種換汽水問題是小學的必考題,直到初中學了方程才學會智慧型的解法。小學時我們經常會遇到這樣的問題,汽水1元,2個瓶子可以換一瓶汽水,10元能喝到多少瓶汽水。然後就可以在紙上模擬整個過程了,答案是20瓶。這種題技巧是如果最後只剩下乙個空瓶子的時候要向老闆借一瓶,然後湊2個瓶子換一瓶汽水,再把最後的2個瓶子還給老闆。

到了初中,我們學會了列方程解決問題。就換了一種思路,不再一步步推算了。其實從題目描述來看,瓶子和汽水都是有價值的,而作為消費者我們的目的是為了喝汽水,所以為了喝到最多的汽水,我們要把所有的錢都換成汽水。

設汽水的價值是x,汽水瓶子的價值是y。

則有 x + y = 1 \\ 2y= x + y \end \right.

x = \dfrac\\ y = \dfrac \end

x=21​y

=21​

​所以能喝到的汽水是10/1

2=

2010/\dfrac=20

10/21​

=20瓶。

那麼華為的題目也可以用類似的辦法做。設瓶蓋的**是x,瓶體的**是y,汽水的**是z。

那麼我們可以列出下面方程組

3 x=

x+y+

z2y=

x+y+

z1=x

+y+z

\begin 3x &= x+y+z\\ 2y &= x+y+z\\ 1 & = x + y + z \end

3x2y1​

=x+y

+z=x

+y+z

=x+y

+z​解得

x =1

3y=1

2z=1

6\begin x = \dfrac\\ y = \dfrac\\ z= \dfrac \end

x=31​y

=21​

z=61

​​所以如果我們可以把錢全部轉化為汽水的話,換句話說,允許向老闆賒賬的話則可以喝20/1

6=

12020/\dfrac=120

20/61​

=120

瓶。然而,這道題其實不允許賒賬。所以直接return 6*x是不行的。

所以老老實實寫程式

#include

intmain()

printf

("%d\n"

,result);}

return0;

}

我們開始定義一下喝汽水的步驟,

(1) 首先將錢換成汽水,將汽水喝完。

(2) 盡可能多的將手中所有的瓶子和瓶蓋換成汽水,如果換不了則結束。

(3) 繼續喝完所有汽水,然後重複步驟二。

按照上述步驟喝汽水,我們可以保證能喝到最多的汽水,最後剩餘的瓶子和瓶蓋也肯定換不了汽水。

然後開始考慮問題複雜在**,在不允許賒賬的情況下,最後可能會剩下瓶子和瓶蓋轉化不成汽水,所以肯定達不到120瓶。

那麼最後會剩幾個瓶子和瓶蓋呢。分類討論下

(1)瓶子數大於等於2或者瓶蓋大於等於3的情況。不可能出現,因為此時還可以繼續換汽水。

(2)只剩下瓶子或者只剩下瓶蓋的情況。不可能出現,假設按照上述步驟喝,到達最後一步不能再換取新的汽水之前,肯定至少喝完了一瓶汽水,那麼肯定剩下至少乙個瓶子喝乙個瓶蓋。

(3)1個瓶子,1個瓶蓋。只剩乙個瓶子乙個瓶蓋,說明在到達最後一步之前的喝汽水的步驟時,我們既沒有瓶蓋也沒有瓶子,只有一瓶汽水。那麼在獲得這一瓶汽水之前的換汽水的步驟裡,肯定只有3個瓶蓋或者2個瓶子,這喝我們的情況2是一樣的,顯然是不可能存在的。所以這一瓶汽水只能是在步驟一中花錢買的,即只有1元錢的時候的情況。 所以當只有1元錢時,我們最終會剩下乙個瓶子和瓶蓋,一共價值為12+

13=5

6\dfrac+\dfrac=\dfrac

21​+31

​=65

​元。那麼只有1

6\dfrac

61​元轉化為了汽水,也就是只能喝一瓶。

(4)1個瓶子,2個瓶蓋。 經過上述討論,只剩下了這一種情況,即只要不是1元錢,肯定最後剩下1個瓶子2個瓶蓋,價值為12+

23=7

6\dfrac+\dfrac=\dfrac

21​+32

​=67

​元。所以最後相比較可以賒賬的情況,會少買7瓶。

下面寫程式:

#include

intmain()

return0;

}

假設我們有m元,汽水**為p,h個瓶蓋可以換取一瓶汽水,b個瓶子可以換一瓶汽水。那麼可以喝多少瓶汽水呢。

暫時還沒有找到很好的規律,隨著h和b的增大,可能最終的情況多了起來。如果每次輸入都進行更改的話,能想到的還是只是去模擬買汽水的步驟。類似於第乙份**,只不過,把hat和body的限制換成輸入。

Leecode 的一道演算法題,記錄一下

最近在leetcode上面刷題,發現了一道有趣的題,以下是他的題目概述 首先,我們通過分析題目了解他大概的問題和需求,其實當中最重要的是如何找到最大的面積,但是又不能以兩個資料最大值的來計算,我們還要分析他的長與寬,話不多說,獻上 裡面有每一句的注釋。list 1,8,6,2,5,4,8,3,7 陣...

一道簡單的演算法題

題目 統計給定數字中,值為1的二進位制位的數量。如果是陣列呢?int getbitcount unsigned int num return count 第一種想法比較簡單,從最後一位開始,比較是否為1,如果為1,就計數器加一。迴圈次數固定,32次。但是這種方法有乙個地方需要注意,那就形參必須為un...

一道簡單題目的複雜演算法

這是我們第一節彙編上機的實驗題目,問題描述 在debug下實現,記憶體區2100h處有乙個位元組帶符號數 用e命令存入 要求程式設計將其取出1 若此數為正,則3000h單元置01h,2 若此數為0,3000h單元置0h,3 若此數為負,3000h單元置ffh。題目很簡單,應該說簡單得讓人做著無聊,於...