sairate c9f8710d03 sairate<sairate@sina.cn>
Signed-off-by: sairate <sairate@sina.cn>
2025-07-12 16:05:52 +08:00

66 lines
1.3 KiB
C++

#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("hut.in");
ofstream fout("hut.out");
inline int sqr(int a) { return a * a; }
const double INFI = 1000000;
const int maxl = 101;
const int maxn = 40;
const int maxm = 40;
double f[maxl][maxm + 1][maxn + 1];
double k1, k2;
double calc(int l, int n)
{
if (n == 0 || n > l) return INFI;
return (l % n) * k2 * sqr(l / n + 1) + (n - l % n) * k2 * sqr(l / n) + k1 * sqr(l);
}
int main()
{
int m, n, i, j, k, mm, nn;
double x, y;
fin >> k1 >> k2 >> m >> n;
for (i = 0; i < maxl; i++) {
for (j = 0; j <= m; j++) {
for (k = 0; k <= n; k++) {
f[i][j][k] = -1;
}
}
}
f[0][0][0] = 0;
for (i = 1; i < maxl; i++) {
for (nn = 1; nn <= n; nn++) {
for (mm = 1; mm <= nn; mm++) {
if (mm > m) break;
f[i][mm][nn] = INFI;
k = 1;
if (mm == 1) k = nn;
for (j = 1; i - j >= mm - 1; j++) {
x = f[i - j][mm - 1][nn - k + 1];
y = calc(j, k - 1);
if (x != -1 && x + y < f[i][mm][nn])
f[i][mm][nn] = x + y;
x = f[i - j][mm - 1][nn - k];
while (x != -1 && x + calc(j, k) < f[i][mm][nn]) {
y = calc(j, k);
if (x + y >= f[i][mm][nn]) break;
f[i][mm][nn] = x + y;
k++;
if (k > nn) break;
x = f[i - j][mm - 1][nn - k];
}
}
}
}
}
fout << f[maxl - 1][m][n] << endl;
return 0;
}