牛客賭神 反向思維

2021-09-05 08:23:40 字數 1281 閱讀 5869

時間限制:c/c++ 1秒,其他語言2秒

空間限制:c/c++ 32768k,其他語言65536k

64bit io format: %lld

買定離手,買定離手!到底誰能捧盃本次新生賽?

億電競的投資人「億大佬」向你介紹遊戲規則:你可以參與數次競猜,每次競猜都有兩個待選隊伍a和b(當然不是競猜新生賽的隊員哈),你可以投入一定的錢給其中乙個隊伍,如果你選擇的隊伍獲得了比賽的勝利,那麼你就會根據賠率獲得相應的收益,但是如果你猜錯了,億大佬就會拿著你的錢去直播間刷火箭。

當然,由於對陣的兩個隊伍的實力一般不會相同,所以賠率也不可能相同。假設下注弱的隊伍且弱的隊伍贏了,你下注的錢就會翻倍(變為原來的2倍),下注了強的隊伍並且強的隊伍贏了,你下注的錢只會增加1元(吃低保真沒意思,但也比賠了好)。

雞尾酒看到宣傳廣告上寫著「點一下,玩一年,投入只要一塊錢」,於是就參加了本次活動。畢竟是「一元博天下」,所以雞尾酒初始只投入了一元。雞尾酒的競猜宗旨是:「什麼賠率分析,什麼強隊弱隊,老夫玩競猜就是一把梭!」所以不管雞尾酒當前有多少錢,他每次都會全部下注。經過若干場競猜之後,雞尾酒戰績全勝,並且手裡的錢變成了n元,你能算出雞尾酒至少參與了幾場競猜嗎?

題目包含多組測試資料,請處理到檔案結束。每組輸入一行表示乙個n(1<=n<=10^9),代表最終的錢數。
對於每個輸入,輸出乙個數字代表從1元賺到n元需要的最少參與競猜的次數。如果無論怎樣都不可能從賺到n元,輸出-1。每個輸出數字佔一行。
示例1

複製

2

3

複製

1

2

對於n=2的情況,

競猜成功一次強隊贏或一次弱隊贏,都能使1元變成2元。

所以答案輸出1。

對於n=3的情況,

可以競猜兩次強隊贏,每次賺一元,就能使1元變成3元,並且沒有辦法通過一次競猜就直接賺到3塊,

所以答案輸出2。

第一眼看上去很像bfs ,但是資料是1e9不好標記。

但是顯然可以反向考慮,當前是nn,如何最快的變成1?

顯然,如果當前是奇數,無法整除二,只能減一,如果是偶數,除二的收益顯然大於減一.

於是不斷除二取餘即可

ac code 

#includeusing namespace std;

int main()

if(n != 1) cout<<-1《前段時間剛做了乙個類似的題,居然給忘了!!! 

b題

賭神(逆向思維)

時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 買定離手,買定離手!到底誰能捧盃本次新生賽?億電競的投資人 億大佬 向你介紹遊戲規則 你可以參與數次競猜,每次競猜都有兩個待選隊伍a和b 當然不是競猜新生賽的隊員哈 你...

牛客,String of CCPC(思維)

題意 給定乙個長度為n的字串s n s n 只由c,p組成,定義s n 的價值為 s n 中不同的 ccpc 連續子串的個數。現可以向這個子串中插入乙個c,p,但第i次操作,需要消耗i 1的單位價值。求s n 的價值最大為多少。分析 稍微分析一下,可以發現,每次操作,最多只能使s n 的價值 1,假...

牛客 Shortest Path dfs 思維

非常巧妙的轉換。首先我們可以觀察性質,一條邊不可能出現兩次,因為顯然可以被更好的方案替代 之後,每個邊就存在選或者不選兩種情況 如果以子樹的節點為偶數,那麼就不需要,否則需要,做一下dfs即可 includeusing namespace std typedef long long ll const...