#include #include int primerjaj_cela (const void * a, const void * b) { const int * c = (const int *) a; const int * d = (const int *) b; return *c - *d; } int postopek (int * l, int n, int * nmvp) { /* funkcija dobi lonce in kazalec na najmanjšo možno vsoto premerov */ qsort(l, n, sizeof(int), primerjaj_cela); /* zanašamo se na procesor in uporabimo zanj najbolj učinkovit sortirni algoritem */ nmvp = 0; int * s = calloc(n, sizeof(int)); /* seznam skladov, sklad v danem trenutku predstavlja najmanjši lonec v njem */ int sn = 0; /* stevilo skladov, da ni treba venomer vrteti po seznamu in iskati NULL */ for (int i = n-1; i >= 0; i--) { /* od največjega lonca proti najmanjšemu najdemo primeren sklad, kamor lahko damo lonec */ for (int j = 0; j < sn; j++) { /* iščemo primeren obstoječ sklad */ if (s[j] > l[i]) { /* če smo našli primeren dom za lonec (: */ s[j] = l[i]; break; } } /* ker ni bilo breaka, smo tukaj, še vedno pa imamo ta velik lonec, ki ne paše v noben obstoječ s, zategadelj naredimo nov s */ s[sn] = l[i]; *nmvp += l[i]; /* povečamo najmanjšo možno vsoto premerov */ } free(s); return sn; /* vrnemo število skladov, najmanjšo možno vsoto premerov - nmvp pa smo itak sproti večali */ } int main (int argc, char ** argv) { if (argc < 1+1) { fprintf(stderr, "uporaba: %s [, diameter lonca 2[, diameter lonca 3[,...]]]\n", argv[0]); return 1; } int * l = calloc(argc, sizeof(int)); for (int i = 0; i < argc-1; i++) l[i] = atoi(argv[i+1]); int nmvp = 0; int ss = postopek(l, argc-1, &nmvp); char * slovenscina_je_lep_jezik; switch (ss % 100) { case 1: slovenscina_je_lep_jezik = ""; case 2: slovenscina_je_lep_jezik = "a"; case 3: case 4: slovenscina_je_lep_jezik = "e"; case 0: default: slovenscina_je_lep_jezik = "ov"; } fprintf(stdout, "potrebujemo najmanj %d sklad%s, najmanjša možna vsota premerov pa je %d.\n", ss, slovenscina_je_lep_jezik, nmvp); free(l); return 0; }