1693 水群(最短路)

基准时间限制:0.4 秒 空间限制:524288 KB 分值: 160  难度:6级算法题
 收藏
 关注
总所周知,水群是一件很浪费时间的事,但是其实在水群这件事中,也可以找到一些有意思的东西。
比如现在,bx2k就在研究怎样水表情的问题。
首先,bx2k在对话框中输入了一个表情 ,接下来,他可以进行三种操作。
第一种,是全选复制,把所有表情全选然后复制到剪贴板中。
第二种,是粘贴,把剪贴板中的表情粘贴到对话框中。
第三种,是退格,把对话框中的最后一个表情删去。
假设当前对话框中的表情数是num0,剪贴板中的表情数是num1,
那么第一种操作就是num1=num0
第二种操作就是num0+=num1
第三种操作就是num0--
现在bx2k想知道,如果要得到n(1<=n<=10^6)个表情,最少需要几次操作。
请你设计一个程序帮助bx2k水群吧。
Input
一个整数n表示需要得到的表情数
Output
一个整数ans表示最少需要的操作数
Input示例
233
Output示例
17
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N =1001111;
const int p[6]= {2,3,5,7,11,13};
int dp[N];
int vis[N];
int main()
{
    memset(dp,0x3f,sizeof(dp));
    int n;
    scanf("%d",&n);
    queue<int>q;
    q.push(1);
    vis[1]=1;
    dp[1]=0;
    while(!q.empty())
    {
        int x=q.front();
        q.pop();
        vis[x]=0;
        if(x-1>=1)
        {
            if(dp[x-1]>dp[x]+1)
            {
                dp[x-1]=dp[x]+1;
                if(vis[x-1]==0)
                {
                    vis[x-1]=1;
                    q.push(x-1);
                }
            }
        }
        for(int i=0; i<6; i++)
        {
            int prim=p[i];
            int y=prim*x;
            if(y<=n+10)
            {
                if(dp[y]>dp[x]+prim)
                {
                    dp[y]=dp[x]+prim;
                    if(!vis[y])
                    {
                        vis[y]=1;
                        q.push(y);
                    }
                }
            }
        }
    }
    printf("%d\n",dp[n]);
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值