题面去内网找。。
虽然是模拟,但必须要写一写。为什么我考试时想不出来,但我同桌成了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]);
}

本文介绍了一道ACM竞赛中的动态规划题目,通过两种转移方式:i->i*k 和 i->i-1 来解决该问题。利用枚举步数的方法,计算每个点在当前步数下能够达到的最远位置,最终找到从起点到终点所需的最小步数。
1万+

被折叠的 条评论
为什么被折叠?



