码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-10-30 19:21:16      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:labyrinth   output   write   sign   ram   开始   close   题解   class   

题意:

给一个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.

 

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

标签:labyrinth   output   write   sign   ram   开始   close   题解   class   

原文地址:http://www.cnblogs.com/myx12345/p/6013417.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!