#include #include #define MAXN 16384 static unsigned lens[MAXN], sums[MAXN]; static unsigned badness[MAXN]; int main (void) { for (;;) { unsigned width; size_t num_words, i; static char buf[128]; scanf ("%u", &width); if (width == 0) break; gets (buf); num_words = 0; sums[0] = 0; for (;;) { const char *p, *s; gets (buf); if (*buf == 0) break; for (p = buf; *p == ' '; p++) ; while (*p != 0) { s = p; while (*p != 0 && *p != ' ') p++; lens[num_words] = p - s; sums[num_words + 1] = p - s + sums[num_words]; num_words++; while (*p == ' ') p++; } } memset (badness, 0xFF, (num_words + 1) * sizeof (*badness)); badness[0] = 0; for (i = 0; i < num_words; i++) { unsigned j, x; if (badness[i] == 0xFFFFFFFFu) continue; x = badness[i]; if (lens[i] != width) x += 500; if (badness[i + 1] > x) badness[i + 1] = x; for (j = i + 2; j <= num_words && sums[j] - sums[i] + j - i - 1 <= width; j++) { unsigned more, o; o = j - i - 1; more = width - (sums[j] - sums[i] + o); x = badness[i]; x += (more % o) * (more / o + 1) * (more / o + 1); x += (o - more % o) * (more / o) * (more / o); if (badness[j] > x) badness[j] = x; } } printf ("Minimal badness is %u.\n", badness[num_words]); } return EXIT_SUCCESS; }