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
Output
Input示例
Output示例
删除可以在任何一个操作后做,粘贴操作也可以看成一个 整体 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;
}
基准时间限制: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;
}
相关文章推荐
- 1693 水群(最短路)
- 51nod 1693 水群(神奇的最短路!)
- 51 nod 1022 石子归并 V2(dp决策单调性)
- 51 nod 1272 最大距离(树状数组)
- [乱搞]51 Nod 1859—Clarke and number
- 51 nod 1310 Chandrima and XOR(规律)
- 51 nod: 1298 圆与三角形
- 51 nod 1080 两个数的平方和
- [51Nod](1091) 线段的重叠 ---- 贪心
- 【51 Nod 1203】JZPLCM
- (51nod)1004 - n^n的末位数字
- (51nod)1090 - 3个数和为0
- 51_nod 1019 逆序数
- 51 nod 1140
- 51 nod 1200 石子游戏V2 FWT
- 51 nod 1004
- 最大子矩阵和 51Nod 1051 模板题
- [51nod 1766]树上的最远点对
- 51 NOD 1685 第K大区间2 二分+BIT
- 51 nod 1255 字典序最小的子序列(单调栈 贪心)