CF 680D 贪心+构造.

题意:若当前体积为X,则每次选一个最接近X的三次方数(p^3<=X)填入.

确定不超过m的X,使得操作次数最多?若有最大操作次数有多种方案,输出X最大的那一种. m<=1e15.

x确定ans也就确定 m很大 直接确定x是不可能的.
令最大的a满足,a^3<=m. 则第一个塞的长度最大为a,最多剩下m-a^3
如果塞边长a-1的 则体积最大剩下a^3-1-(a-1)^3 保证一开始的体积<a^3.
塞a-2的 则最大剩下 (a-1)^3-1-(a-2)^3 此时同样塞了一个,第二个可以选择的空间明显更大 则只考虑前两个即可.(第一个剩余相对大小未知)
某个初始状态塞完a-2后若剩余体积为x 则可以构造出另外一个初始状态塞完(a-1)后也为x. 塞(a-1)绝对不会差.
每次X最大可选范围减少m^(1/3) 暴力dfs即可.

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> ii;
const int N=2e5+20;
ll m;
ii ans;
ll f(ll a)
{
    return a*a*a;
}
void dfs(ll m,ll cur,ll vol)
{
    if(m==0)
    {
        ans=max(ans,ii(cur,vol));
        return;
    }
    ll a=0;
    while(f(a+1)<=m)
        a++;
    dfs(m-a*a*a,cur+1,vol+a*a*a);
    if(a-1>=0)
    {
        ll t=(a-1);
        dfs(a*a*a-1-t*t*t,cur+1,vol+t*t*t);
    }
}
int main()
{
    while(cin>>m)
    {
        dfs(m,0,0);
        printf("%I64d %I64d\n",ans.first,ans.second);
    }
    return 0;
}
 
时间: 2024-12-19 21:23:46

CF 680D 贪心+构造.的相关文章

贪心+构造 Codeforces Round #277 (Div. 2) C. Palindrome Transformation

题目传送门 1 /* 2 贪心+构造:因为是对称的,可以全都左一半考虑,过程很简单,但是能想到就很难了 3 */ 4 /************************************************ 5 Author :Running_Time 6 Created Time :2015-8-3 9:14:02 7 File Name :B.cpp 8 *************************************************/ 9 10 #include

UVA 10821 - Constructing BST(贪心构造)

UVA 10821 - Constructing BST 题目链接 题意:有1 - n的数字,要构造一棵高度不超过h的BST,并且要字典序最小的,输出序列 思路:贪心构造,既然字典序最小,那么每个子树的根都要尽量小,那么也就是右子树尽量填满,按照这个策略去dfs构造即可 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int n, h; void dfs

UVaLive 6588 &amp;&amp; Gym 100299I (贪心+构造)

题意:给定一个序列,让你经过不超过9的6次方次操作,变成一个有序的,操作只有在一个连续区间,交换前一半和后一半. 析:这是一个构造题,我们可以对第 i 个位置找 i 在哪,假设 i  在pos 位置,那么如果 (pos-i)*2+i-1 <= n,那么可以操作一次换过来, 如果不行再换一种,如果他们之间元素是偶数,那么交换 i - pos,如果是奇数,交换 i - pos+1,然后再经过一次就可以换到指定位置. 代码如下: #pragma comment(linker, "/STACK:1

sgu279:Bipermutations(贪心构造)

题目大意: i?j意味着在序列中i的位置在j的前面. 构造一个长度为2n的序列,由1,1′,2,2′...,n,n′构成. 满足如下条件: 1.对于任意i满足i′?i: 2.对于任意i≠j,满足i?j?i′?j′: 3.定义bi,j={j′,j<ij,j>i,ai=∑[i?bi,j],给出序列a,构造出满足a的序列. 分析: 很显然我们要倒着填. 从2n位开始,每次找最小的i使得ai=0填在这一位,更新后面的a,如果找不到,那就找位置最大的没有填过i′的i填在这一位,更新后面的a,否则无解.

sgu280:Trade centers(贪心构造)

题目大意: 给定一棵n个结点的树,从中选出一个最小点集S,使得树中每一个点到点集的最小距离≤k. 分析: 根据贪心原则,每两个S中的点,尽量使得两个点之间的距离=2k+1,因为如果两个点距离≤2k+1,中间所有的点都是可以覆盖得到的. 设fi表示i到子树中某一个S中的点的距离. 如果i为叶子结点,fi=k+1,表示它只能由kth ancestor覆盖(看不懂请往下): 如果i有一个孩子j,那么fi=fj+1: 如果i有两个以上的孩子,那么从孩子中选一个最大的fmax,和最小的fmin.如果fmi

CF - 高精度 + 贪心

Last year Bob earned by selling memory sticks. During each of n days of his work one of the two following events took place: A customer came to Bob and asked to sell him a 2x MB memory stick. If Bob had such a stick, he sold it and got 2x berllars. B

CodeForces - 748D Santa Claus and a Palindrome (贪心+构造)

题意:给定k个长度为n的字符串,每个字符串有一个魅力值ai,在k个字符串中选取字符串组成回文串,使得组成的回文串魅力值最大. 分析: 1.若某字符串不是回文串a,但有与之对称的串b,将串a和串b所有的魅力值分别从大到小排序后,若两者之和大于0,则可以放在回文串的两边. 2.若某字符串是回文串,将其魅力值从大到小排序后,两两依次分析:(mid---可能放在回文串中间的串的最大魅力值) (1)若两个数都是正的,那么就将其放在两边,并将结果计入ans.(ans---回文串两边的串的魅力值之和) (2)

51nod 1255 贪心/构造

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1255 1255 字典序最小的子序列 题目来源: 天津大学OJ 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 给出一个由a-z组成的字符串S,求他的一个子序列,满足如下条件: 1.包含字符串中所有出现过的字符各1个. 2.是所有满足条件1的串中,字典序最小的. 例如:babbdcc,出现过的字符为:abcd,而包含abcd

Codeforces #380 Subordinates(贪心 构造)

从前往后扫,找到一出现次数为0的数,从后面找一个出现不为0的数转化而来.设置两指针l, r来处理. #include<cstdio> #include<iostream> #include<cstdlib> #include<cstring> #include<string> #include<algorithm> #include<map> #include<queue> #include<vector