【19.05%】【codeforces 680D】Bear and Tower of Cubes
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
Limak is a little polar bear. He plays by building towers from blocks. Every block is a cube with positive integer length of side. Limak has infinitely many blocks of each side length.
A block with side a has volume a3. A tower consisting of blocks with sides a1, a2, …, ak has the total volume a13 + a23 + … + ak3.
Limak is going to build a tower. First, he asks you to tell him a positive integer X — the required total volume of the tower. Then, Limak adds new blocks greedily, one by one. Each time he adds the biggest block such that the total volume doesn’t exceed X.
Limak asks you to choose X not greater than m. Also, he wants to maximize the number of blocks in the tower at the end (however, he still behaves greedily). Secondarily, he wants to maximize X.
Can you help Limak? Find the maximum number of blocks his tower can have and the maximum X ≤ m that results this number of blocks.
Input
The only line of the input contains one integer m (1 ≤ m ≤ 1015), meaning that Limak wants you to choose X between 1 and m, inclusive.
Output
Print two integers — the maximum number of blocks in the tower and the maximum required total volume X, resulting in the maximum number of blocks.
Examples
input
48
output
9 42
input
6
output
6 6
Note
In the first sample test, there will be 9 blocks if you choose X = 23 or X = 42. Limak wants to maximize X secondarily so you should choose 42.
In more detail, after choosing X = 42 the process of building a tower is:
Limak takes a block with side 3 because it’s the biggest block with volume not greater than 42. The remaining volume is 42 - 27 = 15.
The second added block has side 2, so the remaining volume is 15 - 8 = 7.
Finally, Limak adds 7 blocks with side 1, one by one.
So, there are 9 blocks in the tower. The total volume is is 33 + 23 + 7·13 = 27 + 8 + 7 = 42.
【题解】
递归求解;
一层层地减少问题的规模;
类似分治的思想;
dfs(int w);表示m=w的时候问题的解是什么;
一开始的时候调用dfs(m);
然后,对于”当前”的w(也即这个子问题中的m);
我们有两种决策
1.直接取最大的;
则我们找到最大的p;
满足p^3<=w;
然后体积递增p^3,方块数递增1,递归求解dfs(w-p^3);
也即m变成了w-p^3,体积可以是1..w-p^3中的任意的最优解;
2.不直接取最大的;换成取中间的某个数字;
对p考虑;
这里的p仍然是上面的p;
我们可以递归求解dfs(p^3-1);
这样,下一层递归里面选最大的就会变成选(p-1)^3;
再往下递归一层就是dfs(p^3-1 - (p-1)^3);
而当我们递归dfs(p^3-1 - (p-1)^3)的时候,方块的数目也只是1;
而dfs(p^3-1 - (p-1)^3)不一定就比dfs(w-p^3)(调用时方块数也是1)大,则我们先比较一下这两个值的大小。如果前者大于后者。则说明前者有可能弄出来更优的解。否则的话就没必要递归dfs(p^3-1);
那有没有可能调用递归dfs((p-1)^3-1)呢?答案是否定的;
因为
f(p) = p^3 - 1 - (p-1)^3在0到正无穷上是一个单调递增的函数;
则dfs((p-1)^3-(p-2)^3)肯定不能弄出比dfs(p^3-1-(p-1)^3)更优的答案;
快速找出那个p可以用二分;
还不理解就多想想吧。
这题想了挺久的。上面也只是我自己的理解。
#include <cstdio>
#include <map>
#include <vector>
#define LL long long
using namespace std;
LL m;
pair <LL, LL> ans;
map <LL, pair<LL, LL> > fre;
LL get_max(LL x)
{
LL l = 1, r = (1e5 + 10);
LL ans;
while (l <= r)
{
LL mid = (l + r) >> 1;
LL t = mid*mid*mid;
if (t <= x)
{
ans = t;
l = mid + 1;
}
else
r = mid - 1;
}
return ans;
}
pair <LL, LL> dfs(LL x)
{
if (x == 0)
return make_pair(0, 0);
if (fre.count(x))
return fre[x];
pair <LL, LL> &temp = fre[x];
LL p3 = get_max(x);
temp.first = 0;
temp = dfs(x - p3);
temp.first++;
temp.second += p3;
pair <LL, LL> temp2;
LL t2 = 0;
if (p3 - 1 > 0)
{
t2 = p3 - 1 - get_max(p3 - 1);
}
if (t2 > (x - p3))
temp2 = dfs(p3 - 1);
else
temp2.first = 0;
if (temp2.first > temp.first)
temp = temp2;
return temp;
}
int main()
{
//freopen("F:\\rush.txt", "r", stdin);
scanf("%I64d", &m);
ans = dfs(m);
printf("%I64d %I64d\n", ans.first, ans.second);
return 0;
}
【19.05%】【codeforces 680D】Bear and Tower of Cubes的更多相关文章
- codeforces 680D D. Bear and Tower of Cubes(dfs+贪心)
题目链接: D. Bear and Tower of Cubes time limit per test 2 seconds memory limit per test 256 megabytes i ...
- 【CodeForces】679 B. Bear and Tower of Cubes
[题目]B. Bear and Tower of Cubes [题意]有若干积木体积为1^3,2^3,...k^3,对于一个总体积X要求每次贪心地取<=X的最大积木拼上去(每个只能取一次)最后总 ...
- Codeforces 680D Bear and Tower of Cubes 贪心 DFS
链接 Codeforces 680D Bear and Tower of Cubes 题意 求一个不超过 \(m\) 的最大体积 \(X\), 每次选一个最大的 \(x\) 使得 \(x^3\) 不超 ...
- Codeforces 680D - Bear and Tower of Cubes
680D - Bear and Tower of Cubes 思路:dfs+贪心,设剩余的体积为res,存在a,使得a3 ≤ res,每次取边长为a的立方体或者边长为a-1的立方体(这时体积上限变成a ...
- Codeforces Round #356 (Div. 2) D. Bear and Tower of Cubes dfs
D. Bear and Tower of Cubes 题目连接: http://www.codeforces.com/contest/680/problem/D Description Limak i ...
- 【19.05%】【codeforces 731F】 Video Cards
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【2018.05.11 智能驾驶/汽车电子】非技术向:关于Simulink和AutoSar的几种观点
最近看到几篇关于Simulink及AutoSar的Blog和Paper,感觉比较有意思,转载备忘之. 1. 看衰Simulink及AutoSar From:Tumiz的技术天地 https://blo ...
- 【2018.05.10 智能驾驶/汽车电子】AutoSar Database-ARXML及Vector Database-DBC的对比
最近使用python-canmatrix对can通信矩阵进行编辑转换时,发现arxml可以很容易转换为dbc,而dbc转arxml却需要费一番周折,需要额外处理添加一些信息. 注意:这里存疑,还是需要 ...
- 【 BowWow and the Timetable CodeForces - 1204A 】【思维】
题目链接 可以发现 十进制4 对应 二进制100 十进制16 对应 二进制10000 十进制64 对应 二进制1000000 可以发现每多两个零,4的次幂就增加1. 用string读入题目给定的二进制 ...
随机推荐
- 2017 校赛 问题 E: 神奇的序列
题目描述 Aurora在南宁发现了一个神奇的序列,即对于该序列的任意相邻两数之和都不是三的倍数.现在给你一个长度为n的整数序列,让你判断是否能够通过重新排列序列里的数字使得该序列变成一个 ...
- HZOJ 太阳神
所以我刚学反演还没学反演就要做这么一道神仙题…… 首先大于n不好求,补集转化. $ans=n*n-\sum \limits _{i=1}^{n} \sum \limits _{j=1}^{n} \le ...
- Java中清空session的方法
session.removeAttribute("sessionname")是清除SESSION里的某个属性. session.invalidate()是让SESSION失效. 或 ...
- 如何实现两个input框的同步更新
class MVVM { constructor(options) { this.$options = options; this.$el = options.el; this.$data = opt ...
- 巨蟒python全栈开发-第11阶段 ansible_project7
今日大纲 1.发布详情页面 2.前端页面获取分支信息 3.前端界面获取commit信息与tag信息 4.获取线上最新版本 5.发布之实现nginx下线 6.发布之实现server发布 7.前端页面按钮 ...
- oracle函数 ROWIDTOCHAR(rowid)
[功能]转换rowid值为varchar2类型 [参数]rowid,固定参数 [返回]返回长度为18的字符串 [示例] SELECT ROWIDTOCHAR(rowid) FROM DUAL; [说明 ...
- 阿里云POLARDB如何助力轻松筹打造5亿用户信赖的大病筹款平台?
轻松筹首创了“大病救助”模式,帮助了众多病患在第一时间解決了医疗资金等问题,为了从源头解决了医疗资金问题.而在轻松筹这样全球5.5亿用户信赖的大病筹款平台的背后,是日益增长的各种数据.面对这样数据量所 ...
- 洞见数据库前沿 集结阿里云数据库最强阵容 DTCC 2019 八大亮点抢先看
摘要: 作为DTCC的老朋友和全球领先的云计算厂商,阿里云数据库团队受邀参加本次技术盛会,不仅将派出重量级嘉宾阵容,还会为广大数据库业内人士和行业用户奉上8场精彩议题.下面小编就为大家提前梳理了8大亮 ...
- 解决uploadify插件不同浏览器下的兼容性问题
http://www.thinkphp.cn/code/2138.html uploadify在部分浏览器上没法使用,或者各种报错的解决方法.uploadify插件上传图片是很爽的体验. 如果用chr ...
- Oracle函数——TO_DATE
TO_DATE 含义:将具有固定格式的字符串类型的数据转化为相对应的Date类型数据,官网解释如下图 使用方法 TO_DATE("需要转换的字符串","日期格式&qu ...