參考資訊:
https://www.cnblogs.com/cnoodle/p/17508179.html
https://www.geeksforgeeks.org/c/c-program-to-implement-priority-queue/
題目:
解答:
void sort_node(int *buf, int index) { int t = 0; int left = (index - 1) / 2; if (index && buf[left] > buf[index]) { t = buf[left]; buf[left] = buf[index]; buf[index] = t; sort_node(buf, left); } } void sort_leaf(int *buf, int size, int index) { int t = 0; int s = index; int left = (2 * index) + 1; int right = (2 * index) + 2; if ((left < size) && (buf[left] < buf[s])) { s = left; } if ((right < size) && (buf[right] < buf[s])) { s = right; } if (s != index) { t = buf[index]; buf[index] = buf[s]; buf[s] = t; sort_leaf(buf, size, s); } } int sort_queue(const void *a, const void *b) { return (*(int *)a) - (*(int *)b); } long long totalCost(int *costs, int costsSize, int k, int candidates) { long long r = 0; int cc = 0; int c0 = 0; int c1 = 0; int size[2] = { 0 }; int buf[2][100000] = { 0 }; c0 = 0; c1 = costsSize - 1; while (k--) { while ((size[0] < candidates) && (c0 <= c1)) { buf[0][size[0]++] = costs[c0++]; sort_node(&buf[0][0], size[0] - 1); } while ((size[1] < candidates) && (c0 <= c1)) { buf[1][size[1]++] = costs[c1--]; sort_node(&buf[1][0], size[1] - 1); } int left = (size[0] > 0) ? buf[0][0] : INT_MAX; int right = (size[1] > 0) ? buf[1][0] : INT_MAX; if (left <= right) { r += buf[0][0]; buf[0][0] = buf[0][--size[0]]; sort_leaf(&buf[0][0], size[0], 0); } else { r += buf[1][0]; buf[1][0] = buf[1][--size[1]]; sort_leaf(&buf[1][0], size[1], 0); } } return r; }