题目描述:
你正在玩一个整数游戏。从整数 1 开始,期望得到整数 target 。
在一次行动中,你可以做下述两种操作之一:
递增,将当前整数的值加 1(即, x = x + 1)。
加倍,使当前整数的值翻倍(即,x = 2 * x)。
在整个游戏过程中,你可以使用 递增 操作 任意 次数。但是只能使用 加倍 操作 至多 maxDoubles 次。
给你两个整数 target 和 maxDoubles ,返回从 1 开始得到 target 需要的最少行动次数。
方法一:
class Solution {
public:
int minMoves(int target, int maxDoubles) {
int ans = 0;
while (maxDoubles > 0 && target != 1)
{
if (target % 2 != 0)
{
ans++;
target--;
}
target /= 2;
ans++;
maxDoubles--;
}
if (target != 1)
{
ans += target - 1;
}
return ans;
}
};
写这道题主要是想提醒一下自己,不要一直死套模板!
今天打周赛前一看到第二题的题目,就很自信地认为肯定是使用bfs来写,使用了单向bfs后果然超时,于是就打算使用双向bfs来试试,结果试了半天最后发现在unordered_map容器中早就已经不支持使用pair作为键值了,浪费了一大堆时间直接吐血= = 。
郁闷地去讨论区逛了逛,发现都没有人在吐槽第二题的,于是返回来又仔细看了看题目和所给的样例,发现在得到taget值之前都是交替使用递增和加倍两种操作的,如果采用逆向思维的话,从target值到1,若是偶数就除2,若是奇数就减1,这也就是交替使用递增和加倍两种操作。最后只用了几分钟就过了。
想不到折磨了那么久,都是一心想套用模板的缘故,模板好用但可不兴乱套啊!