Codeforces 679B - Bear and Tower of Cubes

679B - Bear and Tower of Cubes

题目大意:一个数x定义一种拆分方式,每次拆分取最大的a 且 a^3<=x,x减去a^3,之后重复同样的操作,直到

x变为0。给你一个数m( m<=1e15 ),让你取一个数q<=m,q能执行的操作数在小于等于m的数里面最大,且在操作数

最大的里面,值是最大的。

感觉这种思维题就是特别难。。。。

思路:设a为当前小于等于m的最大立方数。则对于当前的 m 我们有两种情况要考虑,第一种是res1=m-a^3

第二种是不想减去a^3,那么我们就把m变成a^3-1,则他的下一个状态为res2=a^3-1-(a-1)^3,为什么不变成

res3=(a-1)^3-1-(a-2)^3呢,因为res2永远大于res3,所以不用考虑。然后dfs求解就好了。

#include<bits/stdc++.h>
#define ll long long
#define pii pair<ll,ll>
#define fi first
#define se second
#define mk make_pair
using namespace std;
const int N=1e5+5;
const ll MAX=1e15;
vector<ll> pow3;
int len;
ll m,a[N],tot=0,ct[N],last[N];
void init()
{
    for(ll i=1;;i++)
    {
        ll now=i*i*i;
        if(now>1e16) break;
        pow3.push_back(now);
        len++;
    }
}
pii dfs(ll res,ll all,ll num)//返回值为所有解小于等于中res的最优解
{
    if(res==0) return mk(num,all);
    int item=lower_bound(pow3.begin(),pow3.end(),res)-pow3.begin();
    if(pow3[item]>res) item--;
    pii ans=dfs(res-pow3[item],all+pow3[item],num+1);
    if(item>=1)
    {
        pii w=dfs(pow3[item]-1-pow3[item-1],all+pow3[item-1],num+1);
        if(w.fi>ans.fi) ans=w;
        else if(w.fi==ans.fi && w.se>ans.se) ans=w;
    }
    return ans;
}
int main()
{
    init();
    cin>>m;
    pii ans=dfs(m,0,0);
    printf("%I64d %I64d",ans.fi,ans.se);
    return 0;
}

时间: 2024-10-12 21:23:09

Codeforces 679B - Bear and Tower of Cubes的相关文章

codeforces679B Bear and Tower of Cubes(思路)

题意: 给一个m<=10^15,每次都减最接近当前值的立方数 让你找一个不大于m的最大的数并且这个数是减法次数最多的数 思路: 每次有两种情况,一个是减去第一个不大于当前值的立方数 另一个是减去第二个不大于当前值的立方数 但是这时候当前数应变为下一个立方数-1-当前立方数 dfs求最优的解 /* *********************************************** Author :devil Created Time :2016/6/22 16:18:17 ******

Codeforces 385B Bear and Strings

题目链接:Codeforces 385B Bear and Strings 记录下每一个bear的起始位置和终止位置,然后扫一遍记录下来的结构体数组,过程中用一个变量记录上一个扫过的位置,用来去重. #include <iostream> #include <cstdio> #include <cstring> using namespace std; const int MAX_N = 5000 + 100; char str[MAX_N]; struct Node

UVa 10051 Tower of Cubes(DP 最长立体堆叠)

 题意  给你n个立方体  立方体每面都涂有颜色  当一个立方体序号小于另一个立方体且这个立方体底面的颜色等于另一个立方体顶面的颜色  这个立方体就可以放在另一个立方体上面  求这些立方体堆起来的最大高度: 每个立方体有6种放置方式  为了便于控制  个人喜欢将一个立方体分解为6个  这样每个立方体只用考虑顶面和底面   d[i]表示分解后以第i个立方体为基底可以达到的最大高度  j从1到i-1枚举  当满足top[i]==bot[j]时  d[i]=max(d[i],d[j]+1) #in

UVa 10051 Tower of Cubes(DP 最长序列)

Problem A: Tower of Cubes  In this problem you are given N colorful cubes each having a distinct weight. Each face of a cube is colored with one color. Your job is to build a tower using the cubes you have subject to the following restrictions: Never

Codeforces 385C Bear and Prime Numbers(素数预处理)

Codeforces 385C Bear and Prime Numbers 其实不是多值得记录的一道题,通过快速打素数表,再做前缀和的预处理,使查询的复杂度变为O(1). 但是,我在统计数组中元素出现个数时使用了map,以至于后面做前缀和的累加时,每次都要对map进行查询,以至于TLE.而自己一直没有发现,以为是欧拉筛对于这道题还不够优,于是上网搜题解,发现别人的做法几乎一样,但是却能跑过,挣扎了许久才想起是map的原因.map的内部实现是一颗红黑树,每次查询的复杂度为O(logN),在本来时

Codeforces Gym 100269 Dwarf Tower (最短路)

题目连接: http://codeforces.com/gym/100269/attachments Description Little Vasya is playing a new game named "Dwarf Tower". In this game there are n different items,which you can put on your dwarf character. Items are numbered from 1 to n. Vasya want

codeforces 657C - Bear and Contribution [想法题]

题目链接: http://codeforces.com/problemset/problem/657/C -------------------------------------------------------------------------------------------------------- 题目的特别之处在于只有 $+1$ $+5$ 这两种操作 我们要考虑如何利用这个条件 多想一下后可以发现 如果最优解的目标值为$x($将至少$k$个人的值增加到$x)$ 那么一定存在一个

CodeForces 573A Bear and Poker

题目链接:http://codeforces.com/problemset/problem/573/A 题目大意:此题要求一组数中的元素乘以2或者乘以3后得到的数都一样,其实就是判断这些数除去2和3这些因子后剩下的因子都是一样的即可. AC代码: #include <cstdio> #include <cmath> #include <cstring> #include <iostream> using namespace std; #define M 10

Codeforces A - Bear and Prime 100(交互题)

A - Bear and Prime 100 思路:任何一个合数都可以写成2个以上质数的乘积.在2-100中,除了4,9,25,49外都可以写成两个以上不同质数的乘积. 所以打一个质数加这四个数的表:{2,3,4,5,7,9,11,13,17,19,23,25,29,31,37,41,43,47,49},询问19次,如果能被整出两次以上,说明是合数,否则是质数. #include<bits/stdc++.h> using namespace std; #define ll long long