diff options
Diffstat (limited to '1.c')
-rw-r--r-- | 1.c | 94 |
1 files changed, 94 insertions, 0 deletions
@@ -0,0 +1,94 @@ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + + +#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; +} + |