SRM 310 div1
easyだけ解いた
二分探索してレベルを決定して、コーナーケースに気をつけながら表面積を計算する。
コーナーケースありすぎorz
#include <cstdio> #include <algorithm> #include <vector> #include <string> using namespace std; typedef long long ll; class PyramidOfCubes{ public: ll k; ll blocks(ll L){ return L * (L + 1) * (2 * L + 1) / 6; } double solve(int n, int a){ int t = n / a; n %= a; if(t == 0){ return 2.0 + 2.0 * n; } if(n != 0) t++; return 2.0 * a + 2.0 * t; } double surface(int K){ k = K; int h = 10000, l = 1; double ans = 0; bool f = false; for(int i = 0; i < 50; i++){ int m = (h + l) / 2; if(blocks(m) == k){ f = true; l = m; break; } if(blocks(m) < k) l = m; else h = m; } if(!f)l++; if(k < l * l) return solve(k, l) + 2.0 * k; ans = 2.0 * l * l; for(int i = l; i >= 1; i--){ printf("%d %lld %lf\n", i, k, ans); if(i * i <= k){ k -= i * i; ans += 4.0 * i; }else{ if(k == 0) break; ans += solve(k, i); break; } } return ans; } };