賭神(逆向思維)
阿新 • • 發佈:2019-01-06
連結:https://ac.nowcoder.com/acm/contest/321/D
來源:牛客網
時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 32768K,其他語言65536K
64bit IO Format: %lld
題目描述
買定離手,買定離手!到底誰能捧杯本次新生賽?
大家好,歡迎來到由“億電競”贊助的“一元搏天下”活動。
億電競的投資人“億大佬”向你介紹遊戲規則:你可以參與數次競猜,每次競猜都有兩個待選隊伍A和B(當然不是競猜新生賽的隊員哈),你可以投入一定的錢給其中一個隊伍,如果你選擇的隊伍獲得了比賽的勝利,那麼你就會根據賠率獲得相應的收益,但是如果你猜錯了,億大佬就會拿著你的錢去直播間刷火箭。
當然,由於對陣的兩個隊伍的實力一般不會相同,所以賠率也不可能相同。假設下注弱的隊伍且弱的隊伍贏了,你下注的錢就會翻倍(變為原來的2倍),下注了強的隊伍並且強的隊伍贏了,你下注的錢只會增加1元(吃低保真沒意思,但也比賠了好)。
雞尾酒看到宣傳廣告上寫著“點一下,玩一年,投入只要一塊錢”,於是就參加了本次活動。畢竟是“一元博天下”,所以雞尾酒初始只投入了一元。雞尾酒的競猜宗旨是:“什麼賠率分析,什麼強隊弱隊,老夫玩競猜就是一把梭!”所以不管雞尾酒當前有多少錢,他每次都會全部下注。經過若干場競猜之後,雞尾酒戰績全勝,並且手裡的錢變成了N元,你能算出雞尾酒至少參與了幾場競猜嗎?
輸入描述:
題目包含多組測試資料,請處理到檔案結束。每組輸入一行表示一個N(1<=N<=109),代表最終的錢數。
輸出描述:
對於每個輸入,輸出一個數字代表從1元賺到N元需要的最少參與競猜的次數。如果無論怎樣都不可能從賺到N元,輸出-1。每個輸出數字佔一行。
示例1
輸入
2 3
輸出
1 2
說明
對於N=2的情況, 競猜成功一次強隊贏或一次弱隊贏,都能使1元變成2元。
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; int main() { long long int n; int s=0; while(scanf("%lld",&n)!=EOF) { while(n!=1) { if(n%2==1) { n--; s++; } else { n/=2; s++; } } cout<<s<<endl; } return 0; }
所以答案輸出1。 對於N=3的情況, 可以競猜兩次強隊贏,每次賺一元,就能使1元變成3元,並且沒有辦法通過一次競猜就直接賺到3塊, 所以答案輸出2。
題解:逆向思維
程式碼: