牛客赌神-反向思维

赌神

时间限制: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 

#include<bits/stdc++.h>
using namespace std;

int main(){
	int n;
	while(cin>>n){
		int cnt = 0;
		while(n>1)
		{
			if(n%2) n-=1;
			else n/=2;
			cnt++;
		}
		if(n != 1) cout<<-1<<endl;
		else cout<<cnt<<endl;
	}
	return 0;
} 

 

前段时间刚做了一个类似的题,居然给忘了!!! 

B题

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值