1. 程式人生 > >賭神(逆向思維)

賭神(逆向思維)

連結: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。

題解:逆向思維

程式碼: