B3636 文字工作
题目描述
机器猫要在电脑前打字。一共需要打 nn 个字,但现在文档里只有一个字。
机器猫有两种操作可以做。假设现在已经有 xx 个字,机器猫可以选择:
- 往文档最后加一个字。字数变成 x+1x+1。
- 把文档复制粘贴一遍。字数变成 2x2x。
问机器猫至少需要多少次操作,才能得到恰好 nn 个字。
输入格式
仅一行,一个正整数 nn。
输出格式
仅一行,一个正整数,表示最少操作次数。
输入输出样例
输入 #1复制
16
输出 #1复制
4
输入 #2复制
5
输出 #2复制
3
说明/提示
样例解释
样例数据1,1→2→4→8→161→2→4→8→16,共 4 步。
样例数据2,1→2→4→51→2→4→5,共 3 步。
数据规模与约定
对于 100%100% 的数据,n≤106n≤106。
代码:
C++:
#include<iostream>
#include<cmath>
using namespace std;
const int N = 0x3f3f3f;
long long dp[N];
int main() {
int n; cin >> n;
dp[1] = 0;
dp[2] = 1;
if (n == 1) {
cout << dp[1] << endl;
}
else if (n == 2) {
cout << dp[2] << endl;
}
else {
for (int i = 3; i <= n; i++) {
if (i % 2 == 0) {
dp[i] = min(dp[i - 1], dp[i / 2]) + 1;
}
else {
dp[i] = dp[i - 1] + 1;
}
}
cout << dp[n] << endl;
}
return 0;
}
Python:
n = int(input())
N = 1000001
dp = [0] * N
dp[1] = 0
dp[2] = 1
if n == 1:
print(dp[1])
elif n == 2:
print(dp[2])
else:
for i in range(3, n + 1, 1):
if i % 2 == 0:
dp[i] = min(dp[i - 1], dp[int(i / 2)]) + 1
else:
dp[i] = dp[i - 1] + 1
print(dp[n])
Java:
package com.my.gududu;
import java.util.*;
public class dadada{
public static void main(String[] args) {
int N = 1000001;
long dp[] = new long[N];
Scanner input = new Scanner(System.in);
int n = input.nextInt();
dp[1] = 0;
dp[2] = 1;
if (n == 1) {
System.out.println(dp[n]);
}
else if (n == 2) {
System.out.println(dp[n]);
}
else {
for (int i = 3; i <= n; i++) {
if (i % 2 == 0) {
dp[i] = Math.min(dp[i - 1], dp[i / 2]) + 1;
}
else {
dp[i] = dp[i - 1] + 1;
}
}
System.out.println(dp[n]);
}
}
}