首页 > 代码库 > 【CF679B】Theseus and labyrinth(数学,贪心)
【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.
【CF679B】Theseus and labyrinth(数学,贪心)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。