SRM 507 Div1 medium CubePacking

問題概要

Ns個の1辺1の立方体と
Nb個の1辺Lの立方体
Ns will be between 1 and 1,000,000,000, inclusive.
Nb will be between 1 and 1,000,000, inclusive.
L will be between 2 and 10, inclusive.
がある。
できるだけ小さい直方体に詰めたい。
その長方形の大きさを最小化せよ。

解法

全探索。
2000000000^(1/3) * 2000000000^(1/2)くらい.
総体積+L * L * L よりは絶対に大きくならないことがポイント。
それは、2辺をLにしたとき、必ずそれ以下になるため。

ソース


class CubePacking {
public:
  int getMinimumVolume(lli Ns, lli Nb, lli L) {
    lli V = Nb * L * L * L + Ns;
    lli ans = V + L * L * L ;
    for(lli h = L; h * h * h <= V + L * L * L; h++){
      for(lli w = h; h * w * w <= V + L * L * L; w++){
        lli n = (h / L) * (w/ L);
        lli remain = h * w - n * L * L; 
        lli length = (Nb / n) * L;
        remain = Ns - remain * length;
        if(Nb % n != 0){
          length+= L;
          remain -= (h * w * L - (Nb%n) * L * L * L ) ;
        }
        if(remain > 0){
          length += remain / (h * w);
          if(remain % ( h * w) != 0){
            length++;
          }
        }
        ans = min(ans, h * w * length);
      }
    }
    return ans;
  }
};