51nod1693

题解:

首先将问题转化,可以发现操作改为两种

一种是s*=k,代价为k,一种是s--,代价为1

转化成图论,spfa跑最短路

然后更据一些证明,代价1的k<=13且为质数,并且不可能操作2连续5次

所以就可以优化

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1000005,M=20000005;
int n,a[N],b[M],f[N],in[N],dis[N];
int main()
{
    scanf("%d",&n);
    f[0]=6;
    f[1]=2,f[2]=3,f[3]=5,f[4]=7,f[5]=11,f[6]=13;
    int l=0,r=1;
    memset(dis,0x3f,sizeof dis);
    dis[1]=0;
    b[0]=1;
    while (l!=r)
     {
         int now=b[l++];
         in[now]=0;
         l%=M;         
         if (now!=1&&dis[now-1]>dis[now]+1)
          {
              dis[now-1]=dis[now]+1;
              if (!in[now-1])
               {
                   b[r++]=now-1;
                   in[now-1]=1;
                   r%=M;
               }
          }     
         for (int i=1;f[i]*now<=n+10&&i<=f[0];i++)
          {
              int k=f[i]*now;
              if (dis[k]>dis[now]+f[i])
               {
                   dis[k]=dis[now]+f[i];
                   if (!in[k])
                    {
                        b[r++]=k;
                        in[k]=1;
                        r%=M;
                    }
               }
          } 
     }   
    printf("%d",dis[n]); 
}
原文地址:https://www.cnblogs.com/xuanyiming/p/7608232.html