1. 程式人生 > 其它 >藍橋杯 ALGO-985 幸運的店家(貪心)

藍橋杯 ALGO-985 幸運的店家(貪心)

試題 演算法訓練 幸運的店家

資源限制

時間限制:1.0s 記憶體限制:256.0MB

問題描述

  炫炫開了一家商店,賣的貨只有一個,XXX,XXX賣N元錢。有趣的是,世界上只有面值為3的冪的紙幣,即紙幣只有1元的、3元的、9元的。。。。,有一天,橋神來買XXX,可他沒辦法正好給出N元錢,而炫炫沒法找零,於是他只好用他的錢湊出了一個比N大,並且最小的價值,交給了炫炫。炫炫想知道,他這次最多可以得到多少張紙幣。

輸入格式

  一個數,N

輸出格式

  一個數,為答案

樣例輸入

4

樣例輸出

2

資料規模和約定

​ n<=10^17


思路:

  1. 答案必不使用1元,可證明:若需要使用若干1元,得到x,滿足x > N。那麼去掉1元,得到x1,可能滿足x1 >= N

    ,當x1 > N,可知x不是最小,當x1 = N,不符合題意。

  2. 3的冪都能由若干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\)

    )


要點:

  1. 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