文字工作
文字工作
题目描述
机器猫要在电脑前打字。一共需要打 \(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;
}

浙公网安备 33010602011771号