zoukankan      html  css  js  c++  java
  • 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]); 
    }
  • 相关阅读:
    协议与接口相关
    jmeter 使用(1)
    jmeter 压力测试
    shell脚本的规则
    charles的原理及使用
    Linux环境部署和项目构建
    面向对象
    python 基础练习题
    jmeter 使用(2)
    Ext.apply
  • 原文地址:https://www.cnblogs.com/xuanyiming/p/7608232.html
Copyright © 2011-2022 走看看