51 nod 1693 水群
一个整数n表示需要得到的表情数
一个整数ans表示最少需要的操作数
233
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 水群的更多相关文章
- 51nod 1693 水群
基准时间限制:0.4 秒 空间限制:524288 KB 分值: 160 难度:6级算法题 收藏 关注 总所周知,水群是一件很浪费时间的事,但是其实在水群这件事中,也可以找到一些有意思的东西. 比如 ...
- 51nod 1693 水群(神奇的最短路!)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1693 题意: 思路: 这个思路真是神了.. 对于每个点$i$,它需要和$ ...
- 51nod1693 水群
题目链接:51nod1693 水群 题解参考大神的博客:http://www.cnblogs.com/fighting-to-the-end/p/5874763.html 这题时限0.4秒,真的够狠的 ...
- 51 nod 1439 互质对(Moblus容斥)
1439 互质对 题目来源: CodeForces 基准时间限制:2 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 有n个数字,a[1],a[2],…,a[n].有一个集合,刚开 ...
- 51 nod 1495 中国好区间
1495 中国好区间 基准时间限制:0.7 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 阿尔法在玩一个游戏,阿尔法给出了一个长度为n的序列,他认为,一段好的区间,它的长度是& ...
- 51 nod 1427 文明 (并查集 + 树的直径)
1427 文明 题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 安德鲁在玩一个叫“文明”的游戏.大妈正在帮助他. 这个游 ...
- 51 nod 1055 最长等差数列(dp)
1055 最长等差数列 基准时间限制:2 秒 空间限制:262144 KB 分值: 80 难度:5级算法题 N个不同的正整数,找出由这些数组成的最长的等差数列. 例如:1 3 5 6 8 9 ...
- 51 nod 1421 最大MOD值
1421 最大MOD值 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 有一个a数组,里面有n个整数.现在要从中找到两个数字(可以 ...
- 51 nod 1681 公共祖先 (主席树+dfs序)
1681 公共祖先 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 有一个庞大的家族,共n人.已知这n个人的祖辈关系正好形成树形结构(即父亲向儿子连边). 在另 ...
随机推荐
- 工具-VS2015前端开发工具简介
每个涉及的工具库都给出了入门介绍.基本概念,以及在VS和ASP.NET中的用法.这个白皮书完全就是一个非常难得的前端开发入门手册. 具体涉及到的工具库有: 流行的JS任务执行器:Grunt和Gulp. ...
- 关于excel导出
转载自:https://blog.csdn.net/ljj_9/article/details/50395688 //一个excel表格: HSSFWorkbook wb = new HSSFWork ...
- mycat 连续分片 -> 自己定义数字范围分片
1,自己定义数字范围分片 自己定义数字范围分片,提前规划好分片字段某个范围属于哪个分片,比方说将第一个500W的数据分片在第一个节点上面.第二个500W的数据分片在第二个节点上,依次类推 2,加入配置 ...
- Python游戏server开发日记(二)绕过GIL启动多线程Python环境
说道Python和多线程,非常easy想到GIL,GIL意味着仅仅要是用Python做的多线程程序.就无法利用多个CPU. 经过一些失败的尝试后,我也一度觉得GIL是无解的.我们甚至把注意力转向了Ir ...
- svn 服务器的搭建
SVN服务器运行模式:模式1:svn服务器单独运行 监听: 3690端口 访问: svn://IP模式2: svn 服务器+ apache : 80 端口 访问: http://IP ...
- UVA 1149 Bin Packing 二分+贪心
A set of n 1-dimensional items have to be packed in identical bins. All bins have exactly the samele ...
- nyoj--1185--最大最小值(线段树)
最大最小值 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 给出N个整数,执行M次询问. 对于每次询问,首先输入三个整数C.L.R: 如果C等于1,输出第L个数到第R个数 ...
- Kylin基础教程(一)
一.Kylin介绍 1.1 现状 Hadoop于2006年初步实现,改变了企业级的大数据存储(基于HDFS)和批处理(主要基于MR)问题,10几年过去了,数据量随着互联网的发展井喷式增长,如何高速.低 ...
- Jq自定义的方法绑定树结构
1.先上效果图 (借鉴博客) 2.这边不做样式的只做结构 function toTreeData(data) { var pos = {}; var tree = []; var i = 0; wh ...
- 自定义TempData跨平台思路
一:TempData的自定义实现... TempData是用Session实现的,既然是Session,那模式是线程方式...这样的Session是没法进行跨平台的... 那么这就涉及到如何在多台机器 ...