Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <stdio.h>
- typedef struct queue queue;
- struct task
- {
- int val1,val2;
- int sum;
- };
- typedef struct task t;
- struct queue
- {
- t *heap;
- int count,cap;
- };
- int compare(int a, int b)
- {
- return (a < b) ? -1 : 1;
- if(a == b) return 0;
- }
- void initpq(queue *q, int n)
- {
- q->heap = malloc(sizeof(t) * n);
- q->cap = n;
- q->count = 0;
- }
- void swap(queue *q, int i, int j)
- {
- int v1, v2, sum;
- v1 = q->heap[i].val1;
- q->heap[i].val1 = q->heap[j].val1;
- q->heap[j].val1 = v1;
- v2 = q->heap[i].val2;
- q->heap[i].val2 = q->heap[j].val2;
- q->heap[j].val2 = v2;
- sum = q->heap[i].sum;
- q->heap[i].sum = q->heap[j].sum;
- q->heap[j].sum = sum;
- }
- int qempty(queue *q)
- {
- if(q->count == 0) return 1;
- else return 0;
- }
- void insert(queue *q, t ptr)
- {
- int i = q->count;
- if(i == q->cap) printf("queue is full");
- q->count = i + 1;
- q->heap[i] = ptr;
- while(i > 0 && compare(q->heap[i].sum,q->heap[(i - 1)/2].sum) == -1)
- {
- swap(q,(i - 1)/2, i);
- i = (i - 1)/2;
- }
- }
- void heapify(queue *q, int i, int n)
- {
- for(unsigned char k = 0; k < 300; k++)
- {
- int l = 2 * i + 1;
- int r = l + 1;
- int j = i;
- if(compare(l,n) == -1 && compare((q->heap[i].sum),(q->heap[l].sum)) == 1)
- i = l;
- if(compare(r,n) == -1 && compare((q->heap[i].sum ),(q->heap[r].sum)) == 1)
- i = r;
- if(i == j) break;
- swap(q, i, j);
- //i = l;
- }
- }
- t exMax(queue *q)
- {
- if(qempty(q)) printf("Empty :3");
- t ptr = q->heap[0];
- q->count--;
- if(!qempty(q))
- {
- q->heap[0] = q->heap[q->count];
- heapify(q,0,q->count);
- }
- return ptr;
- }
- void free_all(queue *q)
- {
- free(q->heap);
- free(q);
- }
- int main()
- {
- int n,k;
- scanf("%d", &k);
- scanf("%d", &n);
- queue *q = (queue *)malloc(sizeof(queue) * n);
- initpq(q,n);
- t *tsk = (t *)malloc(sizeof(t) * n);
- for(int i = 0; i < n; i++)
- {
- int t1, t2;
- scanf("%d", &t1);
- scanf("%d", &t2);
- tsk[i].val1 = t1;
- tsk[i].val2 = t2;
- }
- for(int i = 0; i < k; i++)
- {
- tsk[i].sum = tsk[i].val1 + tsk[i].val2;
- insert(q,tsk[i]);
- }
- int j = k;
- t c;
- int max;
- while(!qempty(q))
- {
- c = exMax(q);
- if(j < n)
- {
- if(compare(tsk[j].val1,c.sum) == 1) max = tsk[j].val1;
- else max = c.sum;
- tsk[j].sum = max + tsk[j].val2;
- insert(q,tsk[j]);
- j++;
- }
- }
- printf("%d\n", c.sum);
- free(tsk);
- free_all(q);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement