文字工作

文字工作

题目描述

机器猫要在电脑前打字。一共需要打 \(n\) 个字,但现在文档里只有一个字。

机器猫有两种操作可以做。假设现在已经有 \(x\) 个字,机器猫可以选择:

  • 往文档最后加一个字。字数变成 \(x+1\)
  • 把文档复制粘贴一遍。字数变成 \(2x\)

问机器猫至少需要多少次操作,才能得到恰好 \(n\) 个字。

输入格式

仅一行,一个正整数 \(n\)

输出格式

仅一行,一个正整数,表示最少操作次数。

样例 #1

样例输入 #1

16

样例输出 #1

4

样例 #2

样例输入 #2

5

样例输出 #2

3

提示

样例解释

样例数据1,\(1\to 2\to 4\to8\to 16\),共 4 步。

样例数据2,\(1\to 2\to 4\to 5\),共 3 步。

数据规模与约定

对于 \(100\%\) 的数据,\(n\leq 10^6\)

分析

本题和硬币问题类似,不能用贪心,比如6 贪心做法是4,正常是3

代码实现

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

const int INF = 1e9; // 初始化一个很大的值,用于比较

int main() {
    int n;
    cin >> n;

    vector<int> dp(n + 1, INF); 
    dp[1] = 0;
    for (int i = 2; i <= n; i++) {
        if(i%2==0)//整除才可以
            dp[i] = min(dp[i-1]+1,dp[i/2]+1);
        else
            dp[i] = min(dp[i],dp[i-1]+1);
    }

    cout << dp[n] << endl;

    return 0;
}
posted @ 2023-08-30 23:21  LongDz  阅读(150)  评论(0)    收藏  举报