A题:

题目: 给定一个整数 n ,你可以进行以下三种操作

操作1:+1

操作2;+2

操作3:×2

问最少需要多少次操作可以将 0 转为为n。

其实就是在问你怎么用这三种操作构造出任意一个数。 假设第i次操作后,得到的数为ai,

那么下一个数a(i+1)可以是2*ai,ai+1,ai+2;

a0=0为偶数,操作2,3不会改变其奇偶性,所以奇数一开始只能由操作1获得。

偶数可以由操作2,3获得,但是操作3增加得更快,所以为偶数时先考虑是不是由操作3得来的,即操作3只能由偶数相乘得到。

余下情况的就是操作2了。

#include<iostream>
#include<stack>
#include<queue>
#include<deque>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
#include<iomanip>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef double llf;


ll OpGet(ll n){
	if(n==0) return 0;
	if(n==1) return 1;
	if(n==1) return 1;
	if((n&1)==0){
		if(n%4==0){
			return OpGet(n/2)+1;
		}else{
			return OpGet(n-2)+1;
		}
		
	}else{
		return OpGet(n-1)+1;
	}
}
void solve() {
	ll x;cin>>x;
	cout<<OpGet(x)<<endl;
}


int main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int t=1;
	while(t--){
		solve();
	}
	return 0;
}