洛谷P1010 [NOIP 1998 普及组] 幂次方 题解
1.洛谷P1028 [NOIP 2001 普及组] 数的计算 题解2.洛谷P1464 Function 题解3.洛谷P2440 木材加工 题解4.洛谷P2678 [NOIP 2015 提高组] 跳石头 题解5.洛谷P1314 [NOIP 2011 提高组] 聪明的质监员 题解6.洛谷P1083 [NOIP 2012 提高组] 借教室 题解7.洛谷P1902 刺杀大使 题解8.洛谷P1873 [COCI 2011/2012 #5] EKO / 砍树 题解9.洛谷P2280 [HNOI2003] 激光炸弹 题解10.洛谷P8218 【深进1.例1】求区间和 题解11.洛谷 P1719 最大加权矩形 题解12.洛谷 P2367 语文成绩 题解13.洛谷P1387 最大正方形 题解14.洛谷P1014[NOIP 1999 普及组] Cantor 表 题解15.洛谷P1563 [NOIP 2016 提高组] 玩具谜题 题解16.洛谷P4924 [1007] 魔法少女小Scarlet 题解17.洛谷P1518 [USACO2.4] 两只塔姆沃斯牛 The Tamworth Two 题解18.洛谷P1786 帮贡排序 题解19.洛谷P1990 覆盖墙壁 题解
20.洛谷P1010 [NOIP 1998 普及组] 幂次方 题解
21.洛谷P1259 黑白棋子的移动 题解22.洛谷P1281 书的复制 题解23.洛谷P1396 营救 题解24.洛谷PP1570 KC 喝咖啡25.洛谷P1661 扩散 题解26.洛谷P1843 奶牛晒衣服 题解洛谷P1010 [NOIP 1998 普及组] 幂次方 题解
思路
使用一个函数 \(dfs\) 作为递归函数,传入一个参数 \(n\) 表示要分解 2 次幂的数。如果 \(n=1\),直接输出 \(2(0)\);如果 \(n=2\),输出 \(2\)。随后输出 \(2\),使用一个变量 \(lg\) 存储 \(\log_2{n}\),若\(lg\neq1\)(即 \(n>2\)),就先输出(
,然后递归 \(dfs(lg)\)(因为要把 \(lg\) 也分解成 2 次幂形式),等递归结束后,把括号补全,输出)
。攒函数末尾判断:如果 \(2^{lg}<n\)(即还没有分解完毕),就输出+
,继续分解 \(dfs(n-2^{lg})\)
代码
#include<bits/stdc++.h> #define endl '\n' using namespace std; const int INF = 0x3f3f3f3f; const double EPS = 1e-8; int n, pow2[205]; void dfs(int r) { if(r == 1) { cout << "2(0)"; return; } if(r == 2) { cout << "2"; return; } int lg = 0; for(lg = 0; lg <= 200; lg++) { if(pow2[lg] <= r && pow2[lg + 1] > r) break; } cout << "2"; if(lg != 1) { cout << "("; dfs(lg); cout << ")"; } if(r > pow2[lg]) { cout << "+"; dfs(r - pow2[lg]); } } int main() { pow2[0] = 1; for(int i = 1; i <= 200; i++) pow2[i] = pow2[i - 1] * 2; cin >> n; dfs(n); return 0; }
AC
记录
提示
本题还可以进行位运算和 STL 函数优化,可以优化一点常数时间,在竞赛上尤为有用。但这里给出的普通写法代码已经足够通过本题,有兴趣的读者可以自行尝试使用位运算和 STL 函数(log2)优化。
本文作者:2789617221guo
本文链接:https://www.cnblogs.com/2789617221guo/p/18726419
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步