#include #include #include #include #define MAX_ELVES 10 #define arrlen(x) (sizeof(x) / sizeof(x[0])) long checkmax(long * maxcals, long * maxelfs, int n, int cal, int elf) { long i, j; for (i = 0; i < n; ++i) { if (cal > maxcals[i]) { if ((j = i + 1) < n) { memmove(maxcals + j, maxcals + i, (n - j) * sizeof(long)); memmove(maxelfs + j, maxelfs + i, (n - j) * sizeof(long)); } maxcals[i] = cal; maxelfs[i] = elf; break; } } return i; } int main(int argc, char ** argv) { char buf[BUFSIZ]; int elves = 1, i; long cal = 0, maxcal[MAX_ELVES] = {0}, elf = 0, maxelf[MAX_ELVES] = {0}; while ((i = getopt(argc, argv, "p:n:")) != -1) { switch (i) { case 'p': switch (atoi(optarg)) { case 1: elves = 1; break; case 2: elves = 3; break; default: fprintf(stderr, "Unexpected puzzle part %s\n", optarg); return -1; } break; case 'n': elves = atoi(optarg); if (elves < 1 || elves > MAX_ELVES) { fprintf(stderr, "Unexpected number of elves %s\n", optarg); return -1; } break; default: return -1; } } while (fgets(buf, sizeof(buf), stdin)) { char * pbuf = buf; long n; if ((n = strtol(buf, &pbuf, 10)) == 0 && pbuf == buf) { checkmax(maxcal, maxelf, elves, cal, elf); cal = 0; ++elf; } else { cal += n; } } checkmax(maxcal, maxelf, elves, cal, elf); for (i = 0, cal = 0; i < elves; ++i) cal += maxcal[i]; printf("maxcal: %ld\n", cal); return 0; }