時間限制: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...