51 nod 1693 水群(最短路)

来源:互联网 发布:centos mysql启动失败 编辑:程序博客网 时间:2024/06/05 13:27

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

删除可以在任何一个操作后做,粘贴操作也可以看成一个 整体 dist[k*x]=dist[x]+k;

http://blog.csdn.net/mrazer/article/details/51512088

#include <cstdio>#include <cstring>#include <algorithm>#include <map>#include <queue>using namespace std;const int N = 1e6+20;typedef long long LL;const LL mod = 1e9+7;const LL inf = 0x3f3f3f3f;struct node{    int x, y, step;    bool operator < (const node &A)const    {        return step>A.step;    }};int px[]= {2,3,5,7,11,13};int vis[N],dist[N], s;queue<int>q;int bfs(){    dist[1]=0;    q.push(1);    while(!q.empty())    {        int u=q.front();        q.pop();        vis[u]=0;        for(int i=0; i<6; i++)        {            if(u<=s&&px[i]*u<s+10&&dist[px[i]*u]>dist[u]+px[i])            {                dist[px[i]*u]=dist[u]+px[i];                if(!vis[px[i]*u])                {                    vis[px[i]*u]=1;                    q.push(px[i]*u);                }            }        }        if(u>=2&&dist[u-1]>dist[u]+1)        {            dist[u-1]=dist[u]+1;            if(!vis[u-1])            {                vis[u-1]=1;                q.push(u-1);            }        }    }    return dist[s];}int main(){    memset(vis,0,sizeof(vis));    memset(dist,0x3f,sizeof(vis));    scanf("%d", &s);    printf("%d\n",bfs());    return 0;}

原创粉丝点击