藍橋杯 ALGO-985 幸運的店家(貪心)
阿新 • • 發佈:2022-02-19
試題 演算法訓練 幸運的店家
資源限制
時間限制:1.0s 記憶體限制:256.0MB
問題描述
炫炫開了一家商店,賣的貨只有一個,XXX,XXX賣N元錢。有趣的是,世界上只有面值為3的冪的紙幣,即紙幣只有1元的、3元的、9元的。。。。,有一天,橋神來買XXX,可他沒辦法正好給出N元錢,而炫炫沒法找零,於是他只好用他的錢湊出了一個比N大,並且最小的價值,交給了炫炫。炫炫想知道,他這次最多可以得到多少張紙幣。
輸入格式
一個數,N
輸出格式
一個數,為答案
樣例輸入
4
樣例輸出
2
資料規模和約定
n<=10^17
思路:
-
答案必不使用1元,可證明:若需要使用若干1元,得到x,滿足x > N。那麼去掉1元,得到x1,可能滿足
x1 >= N
x1 > N
,可知x不是最小,當x1 = N
,不符合題意。 -
3的冪都能由若干3表示,那麼要取得最多,就要全部使用3組合(這應該就是貪心的地方)
-
分情況,若N不能被3整除,結果就是
N / 3 + 1
,若N能被3整除,則答案是n / 3 + 1
(將N的所有3因子除掉後得到n,即n滿足3^k * n = N
)如果N能被3整除,那麼全用3組合就不符合題意了,而可以用3的某次冪來組合,組合的次數就等於
n / 3 + 1
,例:12 = 3 x 4
,可以用 3 來組合4,即 3 + 3 , 那麼就可以用3 x (3 + 3) = 9 + 9
組合 12則最複雜的情況也就是O(\(log_{3}n\)
要點:
- n<=10^17,使用 long long 來讀
程式碼:
#include <iostream> using namespace std; typedef long long LL; LL n, res; int main (){ cin >> n; if (n % 3) res = (n / 3) + 1; else { while (n % 3 == 0) n /= 3; res = (n / 3) + 1; } cout << res << endl; return 0; }
吐槽:
這個用搜索的方法幾乎不可能了吧,貪心快但是好難想哇pwp