【CF679B】Theseus and labyrinth(数学,贪心)

题意:

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

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

思路:见http://blog.csdn.net/miracle_ma/article/details/52458715

开始想用贪心直接写

后面发现步数是对的,但使原数最大很难处理,因为各个i^3之间i的差不都<=1

于是用DFS处理

以下是大神题解:

考虑第一块取多少,最大的a3≤m 
        如果取a,还剩m?a3 
        取a?1的话,那肯定最大的X是a3?1,剩下a3?1?(a?1)3 
        如果取a?2的话,肯定没有a?1来的优,因为剩下的比取a?1剩下的要少 
        所以就是取a或者a?1,然后对于每次剩下的都可以这么考虑 
        如果你问,剩下x的时候,不是应该要取最大的a么 
        所以我们开头假设的X,不一定是最终的X 
        最后根据你取的,重新安排开头的X 
        比如这会剩x,然后取a?1,x当作了a3?1?(a?1)3 
        那么只要在最开始的时候X取小一点就行了 
        所以dfs的时候记录个数,还剩多少,∑a3

 1 var f:array[1..100001]of qword;
 2     n,ans1,ans2:qword;
 3     i:longint;
 4
 5 function clac(x:qword):qword;
 6 var l,r,mid,last:qword;
 7 begin
 8  l:=1; r:=trunc(sqrt(x)); last:=l;
 9  while l<=r do
10  begin
11   mid:=(l+r)>>1;
12   if mid*mid<=x div mid then begin last:=mid; l:=mid+1; end
13    else r:=mid-1;
14  end;
15  exit(last);
16 end;
17
18 procedure dfs(s1,k,s2:qword);
19 var p:qword;
20 begin
21  if s1=0 then
22  begin
23   if (k>ans1)or((k=ans1)and(s2>ans2)) then begin ans1:=k; ans2:=s2; end;
24   exit;
25  end;
26  p:=clac(s1);
27  dfs(s1-f[p],k+1,s2+f[p]);
28  if p>1 then dfs(f[p]-1-f[p-1],k+1,s2+f[p-1]);
29 end;
30
31 begin
32 // assign(input,‘1.in‘); reset(input);
33  //assign(output,‘1.out‘); rewrite(output);
34  readln(n);
35  for i:=1 to 100001 do begin f[i]:=i; f[i]:=f[i]*f[i]*f[i]; end;
36  ans1:=1; ans2:=1;
37  dfs(n,0,0);
38  writeln(ans1,‘ ‘,ans2);
39  //close(input);
40  //close(output);
41 end.
时间: 2024-12-28 19:02:05

【CF679B】Theseus and labyrinth(数学,贪心)的相关文章

hdu 3573(数学+贪心)

Buy Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 868    Accepted Submission(s): 392 Problem Description Imyourgod need 3 kinds of sticks which have different sizes: 20cm, 28cm and 32cm

hdu 5747(数学,贪心)

Aaronson Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 239    Accepted Submission(s): 156 Problem Description Recently, Peter saw the equation x0+2x1+4x2+...+2mxm=n. He wants to find a solut

HDOJ 5073 Galaxy 数学 贪心

贪心: 保存连续的n-k个数,求最小的一段方差....预处理O1算期望... Galaxy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 752    Accepted Submission(s): 176 Special Judge Problem Description Good news for us: to release

codeforces -676D(Theseus and labyrinth)

1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdio> 5 #include <bitset> 6 #include <vector> 7 #include <queue> 8 #include <stack> 9 #include <cmath> 10 #include <li

hdu-5583 Kingdom of Black and White(数学,贪心,暴力)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5583 Kingdom of Black and White Time Limit: 2000/1000 MS (Java/Others)   Memory Limit: 65536/65536 K (Java/Others) Problem Description In the Kingdom of Black and White (KBW), there are two kinds of frog

【CF676D】Theseus and labyrinth(BFS,最短路)

题意:给定一张N*M的地图,每一格都是一个房间,房间之间有门.每个房间可能有四个门,例如>代表右边只有一个门在右边即只能向右走,L代表左边没有门只能除了左其他都可以走等等.现在给出起点和终点,每次你可以把全部房间旋转90度或者移动到相邻的房间,但前提是两个房间之间都有有门,现在要你求起点出发到终点的最少时间. «+» means this block has 4 doors (one door to each neighbouring block); «-» means this block h

Codeforces 735C:Tennis Championship(数学+贪心)

http://codeforces.com/problemset/problem/735/C 题意:有n个人打锦标赛,淘汰赛制度,即一个人和另一个人打,输的一方出局.问这n个人里面冠军最多能赢多少场,其中一个人和另一个人能打比赛当且仅当这两个人赢的局数相差不超过1. 思路:比赛的时候不会做..直接log2(n)交,果断错了.看题解:因为限制条件两个人能比赛当且仅当他们赢得局数相差不超过1,设F[x]为冠军赢x盘的时候需要的总人数,那么有这样的递推式:F[x] = F[x-1] + F[x-2].

【HDU4803】Poor Warehouse Keeper 数学+贪心

#include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/43450731"); } 题意: 初始状态为:1个物品,总价为1. 目标状态为:x个物品,总价为y. 操作A:变为x+1,y+y/x.(y不取整) 操作B:变为x,  y+1 问最少多少步可以达成条件?(最后操作结束后对y取整) 如果不行输出

2017-4-14:Train-第四届福建省赛

G - Easy Game(水题) Fat brother and Maze are playing a kind of special (hentai) game on a string S. Now they would like to count the length of this string. But as both Fat brother and Maze are programmers, they can recognize only two numbers 0 and 1. S