30pts求条
查看原帖
30pts求条
1432988
Yeonjun_0913楼主2025/7/25 14:53

rt,

#include <iostream>
#include <cmath>
#include <climits>
using namespace std;

int n,m,ans=INT_MAX;
int r[17],h[17];
int min_s[17],min_v[17];
void dfs(int dep,int S,int V){
    if (dep==0){
        if (V==n){
            ans=min(ans,S);
        }
        return;
    }
    if (V+min_v[dep]>=n) return;
    if (S+min_s[dep]>=ans) return;
    if (S+2*(n-V)/r[dep+1]>ans) return;
    for (int i=r[dep+1]-1;i>=dep;i--){
        if (dep==m) S=i*i;
        for (int j=min(h[dep+1]-1,(n-V-min_v[dep-1])/(i*i));j>=dep;j--){
            h[dep]=j;
            r[dep]=i;
            dfs(dep-1,S+2*i*j,V+i*i*j);
        }
    }
}

int main (){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> m;
    r[m+1]=sqrt(n);
    h[m+1]=sqrt(n);
    for (int i=1;i<=m;i++){
        min_s[i]=min_s[i-1]+2*i*i;
        min_v[i]=min_v[i-1]+i*i*i;
    }
    dfs(m,0,0);
    if (ans==INT_MAX) cout << 0 << endl;
    else cout << ans << endl;
    return 0;
}
2025/7/25 14:53
加载中...