基准时间限制:0.4 秒
空间限制:524288 KB
分值: 160 
 收藏
 关注
总所周知,水群是一件很浪费时间的事,但是其实在水群这件事中,也可以找到一些有意思的东西。

比如现在,bx2k就在研究怎样水表情的问题。
首先,bx2k在对话框中输入了一个表情,接下来,他可以进行三种操作。
第一种,是全选复制,把所有表情全选然后复制到剪贴板中。
第二种,是粘贴,把剪贴板中的表情粘贴到对话框中。
第三种,是退格,把对话框中的最后一个表情删去。
假设当前对话框中的表情数是num0,剪贴板中的表情数是num1,
那么第一种操作就是num1=num0
第二种操作就是num0+=num1
第三种操作就是num0--
现在bx2k想知道,如果要得到n(1<=n<=10^6)个表情,最少需要几次操作。
请你设计一个程序帮助bx2k水群吧。
Input
一个整数n表示需要得到的表情数
Output
一个整数ans表示最少需要的操作数
Input示例
233
Output示例
17
思路:(从大佬博客里抄袭的)

让我们先来考虑最暴力的做法,同时记录当前已有数字和剪切板中的数字,直接记忆化搜索,三种转移就不用我再多说了吧。倘若在这道题目上硬要想出什么性质的话恐怕有些困难(也许我太弱了),这就要用到这道题目中最关键的一个思想了——输出中间过程,观察其性质。 
不妨让我们来记录一下当前数字是由哪个状态转移过来的,尽管记忆化搜索能跑出来的数据范围比较小,但是再加上我们人类智慧的逻辑推理我们便可以得到过程实际上是这样的(注意x仅代表未知数,不代表具体几次,更不代表其次数相等):


复制*1+粘贴*x(+退格*x)+复制*1+粘贴*x…


其实也很好想吧,连续两次的复制显然是没有意义的,而复制后的退格也可以放到粘贴后面从而对最终得到的结果没有影响,(就这样我用搜索才想到了一个别人可以一眼秒出的结论)既然如此我们为什么不把复制和粘贴看做一个整体呢?于是简化版题意如下:


当前有一个数x,操作1是x∗=k代价为k,操作2是x−−代价为1,求把x从1变到n的最小代价


观察到题目中的操作无非就是由一个数转化到另一个数的时候要付出代价,要求最小化代价。为什么模型好像这么熟悉?经典的最短路模型!连边1:x−>x∗k,连边2:x−>x−1,显然连边数量太庞大了,我们来考虑优化。关键就在于连边1比较恐怖,但我们仔细想想就会发现里边存在大量冗余边。考虑将一个数标准分解k=pa11pa22...,既然我们可以多次复制,为什么我们还需要复制一次后一步步跳到x∗k上去呢(也就是a1∗p1+a2∗p2+...<=k)?由此我们又得到一个优化:连边1转化为只向x∗p连边(p是质数),对结果一定没有影响。 
然后我们似乎遇到了瓶颈,好像没有什么优化的方法了,但这时一定要坚定信念,这道题也是出题人出的呀,他又没有用什么量子计算机来使程序跑得更快,所以直觉告诉我们一定还存在优化(哪来的直觉呀!你明明就是看了题解才知道的好吧)!还记得之前说过做这道题需要的重要思想吗?没错,我们再把最短路的转移过程给输出出来!一个神奇的结论在中间过程中显现了出来:①我们只会用到{2,3,5,7,11}这几个数连出去的边(当然事实上我们用到的貌似还可以更少,但是这就已经够了)(前4个质数会在最小120241处出错)(别问我证明,我并不会)。②退格操作不会连续出现4次以上(别问我证明,我并不会)。这样我们就又减少了大量的冗余边,对于0.4秒我们已经可以出解了。我的比较丑陋的代码(懒得删掉调试信息了)(我们的优化还没有结束!如果想知道的话请看代码下方):

#include<iostream>
#include<cstdlib>
#include<queue>
#include<cstdio>
#include<cstring>
#define MAXN 1000010
using namespace std;
queue<int>que;
int n;
int p[]={,,,,,};
int dis[MAXN],vis[MAXN];
void spfa(int s){
memset(vis,,sizeof(vis));
memset(dis,0x3f,sizeof(dis));
while(!que.empty()) que.pop();
que.push(s);
dis[s]=;vis[s]=;
while(!que.empty()){
int now=que.front();
que.pop();
vis[now]=;
for(int i=;i<;i++){
if(now*p[i]<n+&&dis[now*p[i]]>dis[now]+p[i]){
dis[now*p[i]]=dis[now]+p[i];
if(!vis[now*p[i]]){
vis[now*p[i]]=;
que.push(now*p[i]);
}
}
}
if(dis[now-]>dis[now]+){
dis[now-]=dis[now]+;
if(!vis[now-]){
vis[now-]=;
que.push(now-);
}
}
}
}
int main(){
scanf("%d",&n);
spfa();
cout<<dis[n];
}

 
 

51 nod 1693 水群的更多相关文章

  1. 51nod 1693 水群

    基准时间限制:0.4 秒 空间限制:524288 KB 分值: 160 难度:6级算法题  收藏  关注 总所周知,水群是一件很浪费时间的事,但是其实在水群这件事中,也可以找到一些有意思的东西. 比如 ...

  2. 51nod 1693 水群(神奇的最短路!)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1693 题意: 思路: 这个思路真是神了.. 对于每个点$i$,它需要和$ ...

  3. 51nod1693 水群

    题目链接:51nod1693 水群 题解参考大神的博客:http://www.cnblogs.com/fighting-to-the-end/p/5874763.html 这题时限0.4秒,真的够狠的 ...

  4. 51 nod 1439 互质对(Moblus容斥)

    1439 互质对 题目来源: CodeForces 基准时间限制:2 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 有n个数字,a[1],a[2],…,a[n].有一个集合,刚开 ...

  5. 51 nod 1495 中国好区间

    1495 中国好区间 基准时间限制:0.7 秒 空间限制:131072 KB 分值: 80 难度:5级算法题   阿尔法在玩一个游戏,阿尔法给出了一个长度为n的序列,他认为,一段好的区间,它的长度是& ...

  6. 51 nod 1427 文明 (并查集 + 树的直径)

    1427 文明 题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 难度:6级算法题   安德鲁在玩一个叫“文明”的游戏.大妈正在帮助他. 这个游 ...

  7. 51 nod 1055 最长等差数列(dp)

    1055 最长等差数列 基准时间限制:2 秒 空间限制:262144 KB 分值: 80 难度:5级算法题 N个不同的正整数,找出由这些数组成的最长的等差数列.     例如:1 3 5 6 8 9 ...

  8. 51 nod 1421 最大MOD值

    1421 最大MOD值 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 有一个a数组,里面有n个整数.现在要从中找到两个数字(可以 ...

  9. 51 nod 1681 公共祖先 (主席树+dfs序)

    1681 公共祖先 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题   有一个庞大的家族,共n人.已知这n个人的祖辈关系正好形成树形结构(即父亲向儿子连边). 在另 ...

随机推荐

  1. 基本SQL查询

    当在数据库的表中存入数据后,就可以查询这些已经存入的数据.下面学习基本SQL查询 本节要点: l  如何使用select语句 Select语句的语法 SELECT语句中的运算 使用DISTINCT和U ...

  2. BA--空调静压箱的作用

    空调静压箱的主要作用有两个,一个是降低噪音:一个是提高送风距离.工作原理如下:空调出风从空调风机里面出来的时候,具有很大的风速,同时由于空调风机自身的结构原因,空调的出风并不均衡,空气在风管中相互摩擦 ...

  3. 操作服务器及MySQL数据库可以使其远程链接

    转自原文操作服务器及MySQL数据库可以使其远程链接 一般情况分三个地方准备,MySQL数据库,防火墙,还有你的服务器主机的准备 操作系统为centos6.5.其他系统大致差不多. 1:在服务器中安装 ...

  4. Ubuntu16.04安装Caffe

    一.安装ccmake ccmake和cmake的功能是一样的,但它很方便设置编译前的一些参数,安装只需从官网下载压缩包,解压,最后将解压得到的文件夹中的bin文件夹的路径加入PATH环境变量中即可. ...

  5. Java - 经常使用函数Random函数

    http://blog.csdn.net/pipisorry/article/details/44411541 Random()函数生成随机数 java.util.Random 在Java的API帮助 ...

  6. 怎样在Java中运行Hive命令或HiveQL

    这里所说的在Java中运行Hive命令或HiveQL并非指Hive Client通过JDBC的方式连接HiveServer(or HiveServer2)运行查询,而是简单的在部署了HiveServe ...

  7. COCOS学习笔记--Cocod2dx内存管理(三)-Coco2d-x内存执行原理

    通过上两篇博客.我们对Cocos引用计数和Ref类.PoolManager类以及AutoreleasePool类已有所了解,那么接下来就通过举栗子来进一步看看Coco2d-x内存执行原理是如何的. / ...

  8. 客户端通过wcf来启动或者停止服务器上的windows service

    1.设置服务器上的windows service的security,下面的命令只能用cmd.exe来运行(以管理员模式) sc sdset "LISA_43_Dev_Batch" ...

  9. notepad++ 查找引用(Find Reference)(适用于c c++及各类脚本比如lua、python等)

    在程序开发过程中,程序员经常用到的一个功能就是查找引用(Find Reference),Visual Studio里面的对应功能是“查找所有引用”(Find All References). 我在使用 ...

  10. 个人作业—Alpha项目测试

    这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2 这个作业要求在哪里 https://edu.cnblo ...