题目链接B3636 文字工作
如有侵权,联系必删
题目分析:
这道题可以直接用贪心的思想解
即如果当前n为奇数
n-- 操作数加一
如果为偶数 n直接除以2 操作数加一
code:
#include<iostream>
using namespace std;
int main(){
int ans = 0;
int n;
cin>>n;
while(n!=1)
{
if(n&1)//等价于n%2 == 1;
n--;
else
n/=2;
ans++;
}
cout<<ans;
return 0;
}
那么 dp 应该怎么写呢
和上一题(B3635 硬币问题)差不多
我讲不太清,直接贴代码吧
#include<iostream>
using namespace std;
const int N = 1e6+10;
int f[N] = {1};
int main(){
int n;
cin>>n;
for(int i = 2;i<=n;i++){
if(i&1) f[i] = f[i-1];//这里要分奇偶性 奇数不能除以二哦
else f[i] = min(f[i/2],f[i-1]);
f[i]++;
}
cout<<f[n];
return 0;
}