| ||||||||||
Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
AC奉上#include<iostream> #include<cmath> #include<cstdio> #include<string> #include<iomanip> #include<map> #include<algorithm> #include<queue> #include<vector> using namespace std; int N, M; int min_s = 0x7fffffff; inline int min_v(int m) { int v = 0; for (int R = M - m; R >= 1; R--) { int H = R; v += R * R * H; } return v; } inline int max_v(int r, int h, int m) { int v = 0; for (int R = r, H = h; m <= M; R--, H--,m++) { v += R * R * H; } return v; } inline void dfs(int r, int h, int m, int s, int v) { if (m == M && N == v && s < min_s) { min_s = s; return; } if (r == 0 || s + 2 * (N - v) / r > min_s) return; if (min_v(m) > N - v) return; if (max_v(r, h, m) < N - v) return; for (int R = r - 1; R >= M - m; R--) for (int H = h - 1; H >= M - m; H--) { dfs(R, H, m + 1, s + 2 * R * H, v + R * R * H); } } int main() { scanf("%d%d", &N, &M); for (int r1 = M; r1 * r1 <= N; r1++) for (int h1 = N / (r1 * r1); h1 >= M; h1--) { int s = r1 * r1 + r1 * h1 * 2; int v = r1 * r1 * h1; dfs(r1, h1, 1, s, v); } if (min_s == 0x7fffffff) cout << 0 << endl; else cout << min_s << endl; return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator