这道题思路容易想到,纯模拟不做任何优化可以得30分左右。但是如何去推公式就让人感到了迷茫?听到DB讲的也是一脸茫然?????????
总之是一道让人感到了绝望的题目.
剩下的就看代码了:
#include<iostream> #include<cstdio> #include<cmath> using namespace std; long long maxx=-1; long long mark; long long power(long long a){//快速幂求3次方 long long ans=1; int b=3; while(b){ if(b&1) ans=ans*a; a=a*a; b>>=1; } return ans; } void find(long long m,long long number,long long x)//m表示当前的体积,number表示当前用的积木的个数,x表示当前的自己选的体积? { if(m==0)//如果已经搭完了 { if(number>maxx||(number==maxx&&mark<x)){//判断是不是为最优解 maxx=number; mark=x; } return; } long long a=pow(m,1.0/3);//算最大的边长 find(m-power(a),number+1,x+power(a));//公式递归 find(power(a)-1-power(a-1),number+1,x+power(a-1)); } int main(){ long long m; cin>>m; find(m,0,0);//一开始找的时候没有用积木,m没有减少,x也不知道,所以从初始的状态开始。
cout<<maxx<<" "<<mark;
}