【2018/09/22測試T2】【WOJ 3977】塔
阿新 • • 發佈:2018-12-12
【題目】
題目描述:
小 想搭一個體積不超過 的塔,他有各種大小的立方積木,比如邊長為 的積木,體積為 ,現在小 需要你給一個 ,每次小 會用一個體積不超過 的最大積木,依次到搭好為止,現在他想最大化積木的個數,同時在積木個數最大的情況下使 最大
輸入描述:
一行一個數
輸出描述:
一行兩個數,最多積木數以及
樣例資料:
輸入
48
輸出
9 42
提示
備註:
【樣例解釋】
= 23 或 42 都是 9 次,42 = + +
【資料範圍】
30%:m ≤
50%:m ≤
100%:m ≤
【分析】
這道題先放一下,我先把程式碼貼出來,待會兒再寫分析
【程式碼】
#include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; long long n,m,ans,sum; void solve(long long m,long long s,long long n) { if(m==0) { if(n>ans||(n==ans&&s>sum)) { ans=n; sum=s; } return; } long long a=floor(pow(m,1.0/3)); solve(m-a*a*a,s+a*a*a,n+1); solve(3*a*a-3*a,s+(a-1)*(a-1)*(a-1),n+1); } int main() { // freopen("tower.in"."r",stdin); // freopen("tower.out","w",stdout); scanf("%lld",&m); solve(m,0,0); printf("%lld %lld",ans,sum); // fclose(stdin); // fclose(stdout); return 0; }