#include #include #include int main(void) { int delka, slov, suma, mezer, minimum; int i=0, j=0, k=0, l=0, m=0, n=0, s=0; int *krasy, *optima, *slova; char *slovo; FILE *inp, *outp; inp = fopen("text.in", "r"); fscanf(inp, "%d %d\n", &slov, &delka); slovo = malloc((delka+1) * sizeof(char)); slova = malloc(slov * sizeof(int)); optima = malloc(slov * sizeof(int)); krasy = malloc(slov * sizeof(int)); for (i = 0; i < slov; i++) { fscanf(inp, "%s", slovo); slova[i] = strlen(slovo); } fclose(inp); free(slovo); for (i = 0; i < slov; i++) { s += slova[i]; suma = s; /* předpočítání součtů krásy */ for (j = 0; j <= i; j++) { mezer = i-j; if (j > 0) suma -= slova[j-1]; l = delka - suma; /* speciální případy */ if ( l < 0) krasy[j] = -1; /* příliš dlouhé */ else if (l == 0) krasy[j] = mezer; /* na řádku nejsou mezery */ else if (i == j) krasy[j] = (l-1) * (l-1); /* jen jedno slovo */ else { m = l / mezer; k = l % mezer; n = mezer - k; krasy[j] = (mezer*m*m) + (n*(-2*m + 1)); } } /* nalezení minima */ if (krasy[0] >= 0) { optima[i] = krasy[0]; } else { minimum = -1; for (j = 0; j < i; j++) { if (krasy[j+1] >= 0) { k = optima[j] + krasy[j+1]; if ((k < minimum) || minimum == -1) minimum = k; } } optima[i] = minimum; } } outp = fopen("ples.out", "w"); fprintf(outp, "%d\n", optima[slov-1]); fclose(outp); return 0; }