Hive 刷題——獎金瓜分問題

晓枫的春天發表於2024-03-23

題目描述

在活動大促中,有玩遊戲瓜分獎金環節。現有獎金池為3000元,代表獎金池中的初始額度。使用者的分數資訊如下:
uid,score
1001,45
1002,40
1003,35
1004,30
1005,25
表中的資料代表每一個使用者和其對應的得分,user_id和score都不會有重複值。瓜分獎金的規則如下:按照score從高到低依次瓜分,每個人都能分走當前獎金池裡面剩餘獎金的一半,當獎金池裡面剩餘的獎金少於500時(不含),則停止瓜分獎金。
解題思路:這是拼多多的一個面試題,需要先進行一點數學層面的分析,把整個瓜分邏輯捋清楚之後不難。這裡給出一種思考邏輯:假設獎金池的初始總獎金為n,那麼第一名分到的獎金為n/2,第二名分到獎金n/4,第三名分到的獎金為n/8,依次類推第x名分到的獎金為n/2^x,然後計算即可。

資料準備

CREATE TABLE temp_score_1120
(
    uid   int,
    score int
) stored as orc tblproperties ('orc.compress' = 'snappy');
insert into temp_score_1120
select 1001, 45
union all
select 1002, 40
union all
select 1003, 35
union all
select 1004, 30
union all
select 1005, 25;

參考實現

select uid
     , score
     , 1 / power(2, rn) * 3000 as prize
from (select uid
           , score
           , row_number() over (order by score desc) as rn
      from temp_score_1120) t1
where 1 / power(2, rn) * 3000 >= 250;

相關文章