Advertisement
Pug_coder

Scorb_AYE

Jan 10th, 2021
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.70 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. typedef struct queue queue;
  4. struct task
  5. {
  6. int val1,val2;
  7. int sum;
  8. };
  9. typedef struct task t;
  10. struct queue
  11. {
  12. t *heap;
  13. int count,cap;
  14. };
  15. int compare(int a, int b)
  16. {
  17. return (a < b) ? -1 : 1;
  18. if(a == b) return 0;
  19. }
  20. void initpq(queue *q, int n)
  21. {
  22. q->heap = malloc(sizeof(t) * n);
  23. q->cap = n;
  24. q->count = 0;
  25. }
  26. void swap(queue *q, int i, int j)
  27. {
  28. int v1, v2, sum;
  29. v1 = q->heap[i].val1;
  30. q->heap[i].val1 = q->heap[j].val1;
  31. q->heap[j].val1 = v1;
  32. v2 = q->heap[i].val2;
  33. q->heap[i].val2 = q->heap[j].val2;
  34. q->heap[j].val2 = v2;
  35. sum = q->heap[i].sum;
  36. q->heap[i].sum = q->heap[j].sum;
  37. q->heap[j].sum = sum;
  38. }
  39.  
  40. int qempty(queue *q)
  41. {
  42. if(q->count == 0) return 1;
  43. else return 0;
  44. }
  45. void insert(queue *q, t ptr)
  46. {
  47. int i = q->count;
  48. if(i == q->cap) printf("queue is full");
  49. q->count = i + 1;
  50. q->heap[i] = ptr;
  51. while(i > 0 && compare(q->heap[i].sum,q->heap[(i - 1)/2].sum) == -1)
  52. {
  53. swap(q,(i - 1)/2, i);
  54. i = (i - 1)/2;
  55. }
  56. }
  57. void heapify(queue *q, int i, int n)
  58. {
  59. for(unsigned char k = 0; k < 300; k++)
  60. {
  61. int l = 2 * i + 1;
  62. int r = l + 1;
  63. int j = i;
  64. if(compare(l,n) == -1 && compare((q->heap[i].sum),(q->heap[l].sum)) == 1)
  65. i = l;
  66. if(compare(r,n) == -1 && compare((q->heap[i].sum ),(q->heap[r].sum)) == 1)
  67. i = r;
  68. if(i == j) break;
  69. swap(q, i, j);
  70. //i = l;
  71. }
  72. }
  73. t exMax(queue *q)
  74. {
  75. if(qempty(q)) printf("Empty :3");
  76. t ptr = q->heap[0];
  77. q->count--;
  78. if(!qempty(q))
  79. {
  80. q->heap[0] = q->heap[q->count];
  81. heapify(q,0,q->count);
  82. }
  83. return ptr;
  84. }
  85. void free_all(queue *q)
  86. {
  87. free(q->heap);
  88. free(q);
  89. }
  90.  
  91. int main()
  92. {
  93. int n,k;
  94. scanf("%d", &k);
  95. scanf("%d", &n);
  96. queue *q = (queue *)malloc(sizeof(queue) * n);
  97. initpq(q,n);
  98. t *tsk = (t *)malloc(sizeof(t) * n);
  99. for(int i = 0; i < n; i++)
  100. {
  101. int t1, t2;
  102. scanf("%d", &t1);
  103. scanf("%d", &t2);
  104. tsk[i].val1 = t1;
  105. tsk[i].val2 = t2;
  106. }
  107. for(int i = 0; i < k; i++)
  108. {
  109. tsk[i].sum = tsk[i].val1 + tsk[i].val2;
  110. insert(q,tsk[i]);
  111. }
  112. int j = k;
  113. t c;
  114. int max;
  115. while(!qempty(q))
  116. {
  117. c = exMax(q);
  118. if(j < n)
  119. {
  120. if(compare(tsk[j].val1,c.sum) == 1) max = tsk[j].val1;
  121. else max = c.sum;
  122. tsk[j].sum = max + tsk[j].val2;
  123. insert(q,tsk[j]);
  124. j++;
  125. }
  126. }
  127. printf("%d\n", c.sum);
  128. free(tsk);
  129. free_all(q);
  130. return 0;
  131. }
  132.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement