Bear and Tower of Cubes Codeforces - 680D
https://codeforces.com/contest/680/problem/D
一道2D,又是搞两个小时才搞出来。。。不过好在搞出来了
官方题解:可以证明对于m,设a是满足a^3<=m的最大a,那么选a或a-1一定最优;那么可以暴力dfs
....23333.。。。。。
完了,我也不知道为什么这个代码能A了
我的想法(仅做记录):对于m=m1的方案,如果最大的选a,那么说明X在[a^3,min((a+1)^3-1,m1)]区间内;这个区间的两个端点都减去a^3后,就发现m=m1的方案,相当于在m=min((a+1)^3-1,m1)-a^3时的方案上再补上取一个a
然后我打了一个很naive的暴力,就是枚举最大的数(设为i)。。根本不能A
考虑优化这个dp:
当m1<(i+1)^3-1即i>(m+1)的三次方根-1时,答案是m=m1-i^3时的答案补上取一个i,显然i变得更小时,答案的第一项不会变得更差,但是当答案的第一项相等时,i越大答案的第二项越好,因此暴力从最小的可能i枚举到最大的可能i,更新答案,如果发现枚举到某处时这一次得到的答案比当前总答案第一项劣,就跳出(所以其实是玄学暴力23333)
当m1>=(i+1)^3-1即i<=(m+1)的三次方根-1时,答案是m=(i+1)^3-i^3-1的答案补上取一个i,显然i变得更大时,答案总体不会变得更劣,因此只求i=(m+1)的三次方根-1时的答案即可
看了题解后发现自己这样搞其实有些无用的枚举(就比如第一种情况也是只考虑一个值就行了,这就是65行以后漏掉了对lt的赋值还能A的原因)
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<map>
#include<cmath>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll,ll> pll;
const ll N=;
ll poww(ll x)
{
return x*x*x;
}
ll work(ll x)
{
ll t=pow(x,0.333333333333333333);
while(poww(t+)<=x) t++;
while(poww(t)>x) t--;
return t;
}
map<ll,pll> an;ll num;
//pll solve(ll m)
//{
// if(an.count(m)) return an[m];
// //num++;
// //if(num%100000==0) printf("%lld\n",num);
// //printf("%lld\n",m);
// //scanf("%d",new int);
// pll ans,t;ll tt;
// for(ll i=1;i<=N;i++)
// {
// tt=poww(i);
// if(tt>m) break;
// //if(poww(i+1)-1>m) break;
// t=solve(min(m,poww(i+1)-1)-tt);
// t.fi++;t.se+=tt;
// ans=max(ans,t);
// }
// return an[m]=ans;
//}
pll solve(ll m)
{
if(an.count(m)) return an[m];
pll ans(-,-),t,lt(-,-);ll t3=work(m+)-;
if(t3>&&t3<=N)
{
t=solve(poww(t3+)-poww(t3)-);
t.fi++;t.se+=poww(t3);
ans=t;
}
if(t3!=m)
{
for(ll i=t3+;i<=N;i++)
{
if(m-poww(i)<) break;
t=solve(m-poww(i));
if(lt.fi!=-&<.fi!=t.fi) break;
t.fi++;t.se+=poww(i);
ans=max(ans,t);
}
}
return an[m]=ans; } int main()
{
ll m;
an[]=mp(,);
scanf("%lld",&m);
auto t=solve(m);
printf("%lld %lld\n",t.fi,t.se);
return ;
}
Bear and Tower of Cubes Codeforces - 680D的更多相关文章
- 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 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 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 ...
- 【CodeForces】679 B. Bear and Tower of Cubes
[题目]B. Bear and Tower of Cubes [题意]有若干积木体积为1^3,2^3,...k^3,对于一个总体积X要求每次贪心地取<=X的最大积木拼上去(每个只能取一次)最后总 ...
- 【19.05%】【codeforces 680D】Bear and Tower of Cubes
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- CodeForces 679B(Bear and Tower of Cubes)
题意:Limak要垒一座由立方体垒成的塔.现有无穷多个不同棱长(a>=1)的立方体.要求:1.塔的体积为X(X<=m).2.在小于X的前提下,每次都选体积最大的砖块.3.在砖块数最多的前提 ...
- uva 10051 Tower of Cubes(DAG最长路)
题目连接:10051 - Tower of Cubes 题目大意:有n个正方体,从序号1~n, 对应的每个立方体的6个面分别有它的颜色(用数字给出),现在想要将立方体堆成塔,并且上面的立方体的序号要小 ...
- Anya and Cubes CodeForces - 525E (双端搜索)
大意: 给定$n$元素序列$a$, 可以任选不超过$k$个$a_i$变换为$a_i!$, 求变换后任选若干元素和为S的方案数. 分成两块暴搜, 复杂度$O(3^{\frac{n}{2}})$ #inc ...
随机推荐
- RBAC打造通用web管理权限
https://www.cnblogs.com/lamp01/p/6576432.html https://www.imooc.com/learn/799
- js中const,var,let区别 今天第一次遇到const定义
今天第一次遇到const定义的变量,查阅了相关资料整理了这篇文章.主要内容是:js中三种定义变量的方式const, var, let的区别. 1.const定义的变量不可以修改,而且必须初始化. 1 ...
- dtd文件中写的引用实体被xml文件引用后无法在浏览器中显示的问题
解决方案:把dtd文件由被xml文件外部引用改成被xml文件内部引用. 例子: 1.xml文件: <?xml version="1.0" encoding="UTF ...
- H3C-L2TP
l2tp enable #启用l2tp domain system authentication ppp local # 本地认证 access-limit disable state active ...
- bootstrap学习大纲
bootstrap 学习分三部分,分别是 css样式,css组件,js插件. 下面介绍三部分分别要学习的内容: 1.css样式:栅格系统,排版,代码,表格,表单,按钮,图片,辅助类,响应式工具. 2. ...
- 一些常用的页面js收集
//正则表达式 验证整数格式function checkInt(tint){ var re=/^[-]{0,1}[1-9]+[0-9]*]*$/; //判断字符串是否为数字 if (re.test(t ...
- starUML安装与破解
安装包百度云: 链接:https://pan.baidu.com/s/1oF_DH7Xh6yun6fFUDB2H3w 密码:1z7e 破解步骤:1. 首先打开你的starUML安装目录,并找到Lice ...
- Linux--top命令查看系统状态,所有值讲解
Linux系统可以通过top命令查看系统的CPU.内存.运行时间.交换分区.执行的线程等信息.通过top命令可以有效的发现系统的缺陷出在哪里.是内存不够.CPU处理能力不够.IO读写过高. 一.top ...
- Codeforces1107E Vasya and Binary String 记忆化dp
Codeforces1107E 记忆化dp E. Vasya and Binary String Description: Vasya has a string \(s\) of length \(n ...
- Introduction to Multi-Threaded, Multi-Core and Parallel Programming concepts
https://katyscode.wordpress.com/2013/05/17/introduction-to-multi-threaded-multi-core-and-parallel-pr ...