塔
来源:互联网 发布:如何自学程序员 编辑:程序博客网 时间:2024/06/11 21:54
塔
题目描述
小A想搭一个体积不超过m的塔,他有各种大小的立方体积木,比如边长为a(a为整数)的积木,体积为
输入描述
一行一个数m
输出描述
一行两个数,最多积木数以及X。
样例输入
48
样例输出
9 42
样例解释
X=23或42时都用了9块积木,
数据范围
30%:m<=
50%:m<=
100%:m<=
(对题目描述有删改)
拿到题还是先看数据规模。对于30%的数据,我们可以用一个数组保存当体积为X时用的积木数,再计算当体积小于等于X时用的积木数。然而,这道题的最大数据规模决定了这道题不需要任何预处理,因为不可能预处理完。所以我们来考虑一下推导。
我们可以知道,当塔的体积为X时,用的第一块积木只能是边长为
我们可以设
参考代码
#include <cstdio>#include <cstdlib>#include <cmath>#include <cstring>#include <iostream>#include <algorithm>#include <vector>#include <string>#include <stack>#include <queue>#include <deque>#include <map>#include <set>using std::cin;using std::cout;using std::endl;inline int readIn(){ int a; scanf("%d", &a); return a;}typedef unsigned long long ll;ll m;ll turt(ll num){ ll l = 1, r = 1e5+1; while(r - l > 1) { ll mid = l + (r - l) / 2; if(mid * mid * mid < num) { l = mid; } else { r = mid; } } if((l + 1) * (l + 1) * (l + 1) <= num) l++; return l;}int f(ll m, ll& x){ ll a = turt(m); if(a == 1) { x += m; return m; } ll y = 0,z = 0; int ans1 = f(m - a*a*a,y) + 1; int ans2 = f(a*a*a - 1 - (a-1)*(a-1)*(a-1), z) + 1; if(ans1 >= ans2) { x = a*a*a + y; return ans1; } else { x = (a-1) * (a-1) * (a-1) + z; return ans2; }}void run(){ cin >> m; ll x = 0; printf("%d ", f(m, x)); cout<<x<<endl;}int main(){ run(); return 0;}
- 塔
- 司徒塔司徒塔
- 印度塔塔集团
- 《凝》--塔
- 司徒塔
- 塔防
- Hanoi塔
- 通天塔
- Hanoi塔
- 【DP】塔
- 数塔
- 数塔
- 数塔
- 数塔
- Hanoi塔
- 数塔
- 数塔
- 数塔
- 如何在新智能背景下重构各个领域的生态系统
- Shrio-007
- Hadoop Map/Reduce执行流程详解
- UVALive 5906 Smoking gun
- A(n,m) 、C(n,m)等几种计数函数的总结
- 塔
- Maven(三) eclipse配置maven + 创建maven项目
- [iOS 核心动画详解转][转][转]
- 跟开振学习Spring AOP第二篇:AOP的概念和流程
- vue环境搭建
- codeforces 712-C. Memory and De-Evolution(数学+逆推)
- PyQt5中文基础教程7 控件1
- UE4 Sockets多线程TCP通信
- 项目中遇到的问题