Codeforces Round #387 (Div. 2), problem: (D) Winter Is Coming Solution in C/C++
#include <limits.h> #include <stdio.h> #include <stdlib.h> int compare(const void *a, const void *b) { int *pa = (int *) a; int *pb = (int *) b; return *pb - *pa; } int main() { int n, k, i, head, tail, a, b; static int aa[200000], bb[200000]; scanf("%d%d", &n, &k); for (i = 0; i < n; i++) scanf("%d", &aa[i]); a = b = 0; head = -1; for (i = 0; i < n; i++) if (aa[i] < 0) { if (head == -1) head = a; else if (a > 0) bb[b++] = a; a = 0; } else a++; tail = a; if (head == -1) printf("0\n"); else { int m, c1, c2, c; qsort(bb, b, sizeof(*bb), compare); /* case 1: end winter tires */ m = n - head; c1 = 1; for (i = 0; i < b && m > k; i++) { m -= bb[i]; c1 += 2; } if (m > k) c1 = INT_MAX; /*case 2: end summer tires */ m = n - head - tail; c2 = 2; for (i = 0; i < b && m > k; i++) { m -= bb[i]; c2 += 2; } if (m > k) c2 = INT_MAX; c = c1 < c2 ? c1 : c2; printf("%d\n", c == INT_MAX ? -1 : c); } return 0; }