题面去内网找。。
虽然是模拟,但必须要写一写。为什么我考试时想不出来,但我同桌成了0.1s内唯一一个A的。。。
一共有两种转移
1.i->i*k
2.i->i-1
而且,f[100000]<50,那么我们枚举步数,然后对于每一个已经到达的点,算他在当前步数最多能更新到多远的点。。
就这样,人家考试A了,我30.。。。。。
#pragma GCC optimize("O3")
#include<cstdio>
#include<cstring>
#define N 1000050
int n,s,f[1000055];
int main()
{
scanf("%d",&n);
memset(f,-1,sizeof(f));f[1]=0;
while(f[n]==-1)
{
s++;
for(int i=1;i<=n+45;i++)
{
if(f[i]==-1)continue;int l=i*(s-f[i]);
if(l<n+45&&f[i]<s&&f[l]==-1)
f[i*(s-f[i])]=s;
if(f[i-1]==-1)f[i-1]=f[i]+1;
}
}
printf("%d",f[n]);
}