您的位置:首页 > 其它

51 nod 1693 水群(最短路)

2017-10-25 16:06 239 查看
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
,dist
, 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: