热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PKU1945【PowerHungryCows】

描述小KITTY想要快速计算整数P的幂(1
描述
小KITTY想要快速计算整数P的幂 (1 <&#61; P <&#61;10,000),它们需要你的帮助。因为计算极大数的幂&#xff0c;所以它们同一时间仅能使用2个存储器&#xff0c;每个存储器可记录某个结果值。第一件工作是初始化存储器内的值一个为底数x&#xff0c; 另一个为1。 小KITTY可以相乘或相除2个存储器中的值&#xff0c;并把结果存在其中某个存储器内&#xff0c;但所有存储的结果必须是整数。
例如, 如果他们想计算x^31, 一种计算方法是:
WV1 WV2
开始: x 1
存储器1和存储器1相乘&#xff0c;结果存于存储器2: x x^2
存储器2和存储器2相乘&#xff0c;结果存于存储器2: x x^4
存储器2和存储器2相乘&#xff0c;结果存于存储器2: x x^8
存储器2和存储器2相乘&#xff0c;结果存于存储器2: x x^16
存储器2和存储器2相乘&#xff0c;结果存于存储器2: x x^32
存储器2和存储器1相除&#xff0c;结果存于存储器2: x x^31
因此, x^31可以通过6次计算得出。给出要计算的幂次&#xff0c;要求求出最少需要几次计算。 输入输出格式

输入

仅一个整数: P

输出

仅一个整数&#xff1a;最少计算次数。
输入输出样例

输入样例

31

输出样例

6

解题思路

  别看什么乘啊除的&#xff0c;就看它们的幂相加相减就行就是有a&#61;1,b&#61;0&#xff0c;经过最小次数加减得到p 。

  我先用的分支限界枚举深度&#xff0c;然后就五个剪枝在题解里见啦

题解

1 #include
2 using namespace std;
3 int p;
4 int qwe;//随手打的&#xff0c;表示深度&#xff0c;分支限界必备
5 int _pow[100];//存2的次方的
6 void dfs(int a,int b,int dep)
7 {
8 if(a//把大的放前面&#xff0c;方便操作
9 swap(a,b);
10 if(dep&#61;&#61;qwe&#43;1)//深度达到
11 {
12 if(a&#61;&#61;p||b&#61;&#61;p)//判断是否有p
13 {
14 cout<<qwe;
15 exit(0);//这里直接停止就可以避免其他搜索&#xff0c;大大节省时间&#xff0c;居家旅行必备
16 }
17 return;
18 }
19 if(a!&#61;0&&b!&#61;0&&p%(__gcd(a,b))!&#61;0)return;//因为a&#43;-b&#61;&#xff08;a0&#43;b0&#xff09;*gcd(a,b)&#61;k*gcd(a,b),k为整数&#xff0c;所以p必须能被gcd(a,b) 整除
20 if(a*_pow[qwe-dep&#43;1]return;//极大化剪枝&#xff0c;如果两个数中的大数每次都*2&#xff0c;直到限定深度都不能达到p的值&#xff0c;也没必要做下去&#xff0c;不优秀
21 if(a>p&&b&#61;&#61;0)return;//这个只能加自己或减自己&#xff0c;而本来就大所以不能加&#xff0c; 而减就变成0&#xff0c;所以不优秀
22 if(a>2*p)return;//这个一看就知道加到两倍的p去了&#xff0c;肯定不优秀
23 if(a&#61;&#61;b)return;//两个数相等和一个数差不多&#xff0c;所以不优秀
24 /*下面8种自己慢慢枚举
25 原来是有12种的&#xff0c;但是0的话就等于只有一个数可操作&#xff0c;不够优秀
26 而加上负数等于减去正数&#xff0c;减去负数等于加上正数&#xff0c;所以这里 用的abs */
27 dfs(a&#43;b,b,dep&#43;1);
28 dfs(a&#43;b,a,dep&#43;1);
29
30 dfs(abs(a-b),b,dep&#43;1);
31 dfs(abs(a-b),a,dep&#43;1);
32
33 dfs(a&#43;a,b,dep&#43;1);
34 dfs(a&#43;a,a,dep&#43;1);
35
36 dfs(b&#43;b,b,dep&#43;1);
37 dfs(b&#43;b,a,dep&#43;1);
38 }
39 int main()
40 {
41 _pow[0]&#61;1;//0次方是1
42 for(int i&#61;1;i<&#61;16;i&#43;&#43;)//枚举2的次方&#xff0c;方便极大化剪枝
43 {
44 _pow[i]&#61;_pow[i-1]*2;
45 }
46 cin>>p;
47 //分支限界
48 for(qwe&#61;1;;qwe&#43;&#43;)//一定从0开始&#xff0c;万一碰到那些p&#61;&#61;0或者p&#61;&#61;1 就等着~~听取WA声一片~~吧
49 {
50 dfs(1,0,1);
51 }
52 return 0;
53 }

 

转:https://www.cnblogs.com/hualian/p/11181925.html



推荐阅读
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
author-avatar
丽sd园印章
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有