codeforces679B Bear and Tower of Cubes(思路)

题意:

给一个m<=10^15,每次都减最接近当前值的立方数

让你找一个不大于m的最大的数并且这个数是减法次数最多的数

思路:

每次有两种情况,一个是减去第一个不大于当前值的立方数

另一个是减去第二个不大于当前值的立方数

但是这时候当前数应变为下一个立方数-1-当前立方数

dfs求最优的解

/* ***********************************************
Author        :devil
Created Time  :2016/6/22 16:18:17
************************************************ */
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <cmath>
#include <stdlib.h>
using namespace std;
typedef long long LL;
LL re[100010];
pair<LL,LL>ans;
void dfs(LL now,LL cnt,LL cur)
{
    if(!now)
    {
        ans=max(ans,make_pair(cnt,cur));
        return ;
    }
    int q=upper_bound(re+1,re+100002,now)-re;
    q--;
    dfs(now-re[q],cnt+1,cur+re[q]);
    if(q>1) dfs(re[q]-1-re[q-1],cnt+1,cur+re[q-1]);
}
int main()
{
    LL p;
    scanf("%I64d",&p);
    for(LL i=1;i<=100001;i++)
        re[i]=i*i*i;
    dfs(p,0,0);
    printf("%I64d %I64d\n",ans.first,ans.second);
    return 0;
}
时间: 2024-09-30 15:42:01

codeforces679B Bear and Tower of Cubes(思路)的相关文章

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,

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

UVa 10051 - Tower of Cubes

题目:给你n个正方体,每个面有一种颜色,他们按照重量递增的方式排列着,现在要求把他们排成一个塔, 每层一个正方体,要求每个正方体上面的正方体的重量全都小于他,还要保证接触的面上的颜色相同, 问最高能摆放多少层,答案不唯一. 分析:dp,动态规划,lis.最大不下降子序列,已经排好序,满足接触的面颜色相同即可. 定义状态:f(i,k)为以第i个方块作为顶时,k面朝上时的最大高度: 转移方程:f(i,k)= max(f(j,f))  { j < i,且相接处的面相同 }: 每个方块有6中摆放法式,利

UVA 10051 --Tower of Cubes +dp

先将立方体按重量从大到小排序,然后就转成了类似于最长上升子序列的问题: 定义状态dp[i][j]表示以第i个立方体的第j面作为顶面时的最大高度. 则dp[i][j]=max(dp[k][d]+1;1<=k<=i-1,m[i][5-j]==m[d][k]) 注意为了方便后面的状态判定,我们在输入的时候要使得相对的面的坐标和为一个常数5. 对于路径输出,我们可以采用记录父节点的方法. 代码如下: #include<iostream> #include<cstring> #i

acm刷题记录

我感觉毫无目的地刷题没有意义,便记录每周的刷题,以此激励自己! ----------6.6-------- [vijos1055]奶牛浴场                                      最大化               推荐IOI论文<浅谈用极大化思想解决最大子矩形问题> codeforces 679B - Bear and Tower of Cubes      xjb搞 codeforces  680A - Bear and Five Cards       

Codeforces Round #356 (Div. 2) [Codeforces680]

此处有目录↑ Codeforces Round #356(Div. 2):http://codeforces.com/contest/680 A. Bear and Five Cards (贪心) time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output A little bear Limak plays a game. He has

sgu-263 Towers

题目大意: 从1-106有106个基底,一开始上面都没有积木,高度为0,连续的一段高度大于0的基底算作一个tower,显然一开始tower数为0. 接下来有两个操作: 1.put x c 将c个积木放在第x个基底上. 2.tput t x c 将c个积木放在第t个tower中的第x个基底上(tower从左到右排列并且保证存在这个基底). 然后有四个询问: 1.towers 问当前有多少个tower. 2.cubes t 问第t个tower一共有多少个积木. 3.length t 问第t个towe

dp题目列表

10271 - Chopsticks 10739 - String to Palindrome 10453 - Make Palindrome 10401 - Injured Queen Problem 825 - Walking on the Safe Side 10617 - Again Palindrome 10201 - Adventures in Moving - Part IV 11258 - String Partition 10564 - Paths through the Ho