【极大化剪枝】Power Hungry Cows-C++【没有用A*!】【超级简单!】
Description
小KITTY想要快速计算整数P的幂 (1 <= P <=10,000),它们需要你的帮助。因为计算极大数的幂,所以它们同一时间仅能使用2个存储器,每个存储器可记录某个结果值。第一件工作是初始化存储器内的值一个为底数x, 另一个为1。 小KITTY可以相乘或相除2个存储器中的值,并把结果存在其中某个存储器内,但所有存储的结果必须是整数。
例如, 如果他们想计算x^31, 一种计算方法是:
WV1 WV2
开始: x 1
存储器1和存储器1相乘,结果存于存储器2: x x^2
存储器2和存储器2相乘,结果存于存储器2: x x^4
存储器2和存储器2相乘,结果存于存储器2: x x^8
存储器2和存储器2相乘,结果存于存储器2: x x^16
存储器2和存储器2相乘,结果存于存储器2: x x^32
存储器2和存储器1相除,结果存于存储器2: x x^31
因此, x^31可以通过6次计算得出。给出要计算的幂次,要求求出最少需要几次计算。
Input
仅一个整数: P
Output
仅一个整数:最少计算次数。
Sample Input
31
Sample Output
6
提醒一下:爆搜样例都过不了是真的会爆
这篇博客主要是讲不用A*怎么优化代码不TLE的。
这道题目网上有很多做法,但是正解都统一到了一个知识点:
A*启发型搜索
这个东西很麻烦,会引申到知识点:
哈希表
估价函数
以及很多…
完全不是搜索初学者能够完成的一道题目!!!!
但是!
这道题目真的有这么麻烦吗?
这里需要普及一种算法:
极大化剪枝
这是个好东西!就是这个算法让我能够不碰A*就能写出代码。
什么是极大化剪枝呢?
每个有效状态都使得它之后的所有状态极大化,如果这样都无法得到最终的答案,那么这个状态是一个无解的状态,可以剪枝。
这个极大化剪枝对程序时间的控制有多大的作用呢?
这么说吧:
当我的代码没有A*,没有极大化剪枝的时候,p=500我需要6000ms,但是加了极大化剪枝,p=500只需要0ms就可以跑出来。
怎么实现呢?其实很简单,这道题目的极大化剪枝的难点就在于怎么模拟每个状态之后所有状态极大化所得到的值呢?
这道题目还用到了分支限界
因为这不是重点,所以简单说一下:
分支限界,每次都规定搜索的深度,如果深度到达了规定的限度,不管是否达到目标状态,都要退出搜索。
分支限界的好处在于可以减少DFS的搜索量,能够快速的计算输出最优解的步数(或者是其他)
通常定义一个全局变量(lim),然后在主函数里面写:
for(lim=;;lim++)
dfs...
相应的,DFS里的返回条件,变成了:
if(深度超限)
{
if(达到目标状态)
{
进行操作
}
return;
}
这样就达到了分支限界的效果了.
极大化剪枝怎么实现呢?
在什么情况下,就算在极限状态下也无法让a或b大于等于p?
只有当a,b中较大的在极限次数范围内不停自加,最终结果还是<p的时候,当前状态是无解的。
那么我们就可以开一个数组,下标为i的存储2的i次方(预处理数组),然后拿a,b较大数乘剩下的操作次数(lim-dep+1)为下标的预处理数组,如果结果还小于p,那么就剪枝.。
然后加上网上搜集整理的剪枝:(为了方便处理,a一定是大于等于b的)
if(a==b)return;
if(a>p&&b==)return;
if(p%__gcd(a,b)!=)return;
if(a>*p)return;
不要问为什么我也不会证
另外就是拓展问题。
看到有些大佬是拓展了12种方案的,但是做减法的四种可以优化一下,只弄2种:
dfs(abs(a-b),b,s+);
dfs(a,abs(a-b),s+);
然后自除太弱鸡我直接删了
就只剩下8种拓展方案:
dfs(a+b,b,s+);
dfs(a,a+b,s+);
dfs(abs(a-b),b,s+);
dfs(a,abs(a-b),s+);
dfs(a*,b,s+);
dfs(a,a*,s+);
dfs(a,b*,s+);
dfs(b*,b,s+);
完整代码也很简单,至少比什么A*简单多了
#include<bits/stdc++.h>
using namespace std;
int p,cnt,lim,st,ed,cut[]={};
void dfs(int a,int b,int s)
{
if(a<=b)swap(a,b);
if(s>lim)
{
if(a==p||b==p)
{
cout<<s<<endl;
exit();
}
return;
}
if(a*cut[lim-s+]<=p)return;
if(a==b)return;
if(a>p&&b==)return;
if(p%__gcd(a,b)!=)return;
if(a>*p)return;
if(a<&&b<)return;
dfs(a+b,b,s+);
dfs(a,a+b,s+);
dfs(abs(a-b),b,s+);
dfs(a,abs(a-b),s+);
dfs(a*,b,s+);
dfs(a,a*,s+);
dfs(a,b*,s+);
dfs(b*,b,s+);
}
int main()
{
cin>>p;
if(p==||p==)
{
cout<<<<endl;
return ;
}
for(int i=;i<=;i++)
{
cut[i]=cut[i-]*;
}
for(lim=;;lim++)
dfs(,,);
return ;
}
经过这番优化,10个点总用时只有惊人的16ms
ov.
【极大化剪枝】Power Hungry Cows-C++【没有用A*!】【超级简单!】的更多相关文章
- 『Power Hungry Cows A*启发式搜索』
Power Hungry Cows(POJ 1945) Description FJ的奶牛想要快速计算整数P的幂 (1 <= P <=20,000),它们需要你的帮助.因为计算极大数的幂, ...
- [USACO2002][poj1945]Power Hungry Cows(启发式搜索)
Power Hungry CowsTime Limit: 1000MS Memory Limit: 30000K Total Submissions: 4570 Accepted: 1120 Desc ...
- 【BFS】Power Hungry Cows
Power Hungry Cows Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 5522 Accepted: 1384 ...
- poj 1945 Power Hungry Cows A*
Description: 就是给你一个数,你可以把它自乘,也可以把他乘或除以任意一个造出过的数,问你最多经过多少次操作能变换成目标数 思路:这题真的不怎么会啊.n = 20000,每一层都有很 ...
- BZOJ1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛
1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 665 Solved: 419 ...
- BZOJ 1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛( LIS )
裸的LIS ----------------------------------------------------------------- #include<cstdio> #incl ...
- 【动态规划】bzoj1669 [Usaco2006 Oct]Hungry Cows饥饿的奶牛
#include<cstdio> #include<algorithm> using namespace std; int n,a[5001],b[5001],en; int ...
- 【BZOJ】1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛(lis)
http://www.lydsy.com/JudgeOnline/problem.php?id=1669 水题太严重 #include <cstdio> #include <cstr ...
- bzoj 1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛【dp+树状数组+hash】
最长上升子序列.虽然数据可以直接n方但是另写了个nlogn的 转移:f[i]=max(f[j]+1)(a[j]<a[i]) O(n^2) #include<iostream> #in ...
随机推荐
- 2020企业python真面试题持续更新中
目录 1.软件的生命周期 2.如何知道一个python对象的类型 3.简述Django的设计模式MVC,以及你对各层的理解和用途 4.什么是lambda函数,说明其使用场景 5.python是否支持函 ...
- 网络模式: host-only & NAT & 桥接
基本上,Host-only相当于虚拟机和宿主机通过交叉线相连:NAT,宿主机相当于虚拟机的路由器:桥接,相当于把宿主机和虚拟机同时接到交换机上,然后交换机接到外网. 连接性上说,可参考下表: 连接 宿 ...
- spark集群安装并集成到hadoop集群
前言 最近在搞hadoop+spark+python,所以就搭建了一个本地的hadoop环境,基础环境搭建地址hadoop2.7.7 分布式集群安装与配置 本篇博客主要说明,如果搭建spark集群并集 ...
- Java BinarySearch
Java BinarySearch /** * <html> * <body> * <P> Copyright 1994-2018 JasonInternation ...
- 奇妙的算法【10】TX--有效号码、最,小耗时、最小差值、差值输出、异或结果
昨晚刚刚写的几道算法题,难度也还行,就是全部AC有些困难,当时第一题AC.第二题AC 60%,第四题AC 40%,第五题没有时间写完了,这个应该全部AC了:其中第三题没有写出来 1,是否存在符合规范的 ...
- JDBC 复习3 存取Oracle大数据 clob blob
1 目录结构记得导包咯 mysql oracle 2 代码,DBUtil工具类见前面的随笔博文 package dbex.mysql; import java.io.BufferedReader; i ...
- [转载]Java中继承、装饰者模式和代理模式的区别
[转载]Java中继承.装饰者模式和代理模式的区别 这是我在学Java Web时穿插学习Java设计模式的笔记 我就不转载原文了,直接指路好了: 装饰者模式和继承的区别: https://blog.c ...
- Docker启动Mongo报警告WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
警告信息 2019-11-27T09:28:16.659+0000 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_h ...
- php实现命令行里输出带颜色文字
今天执行composer的时候看到命令窗口出现的提示里面有的关键性部分带有颜色,于是很好奇研究了一下,在这里记录下来 其实在命令行输出带颜色字体主要是使用的 ANSI 转义字符实现的,我们先看个例子: ...
- Twitter Bootstrap:前端框架利器
Bootstrap 的文件结构 读者可以直接从 GitHub 下载到 Bootstrap 源码,本地解压后可以看到这样的目录结构:docs.img.jquery-ui- bootstrap.js 和 ...