Advertisement
BlueBear

6_1.c

Nov 12th, 2013
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.77 KB | None | 0 0
  1. // uloha-6-1.c -- Tyzden 6 - Uloha 1
  2. // Laszlo Nagy, 2.11.2013 01:44:21
  3.  
  4. #include<stdio.h>
  5. #include<stdlib.h>
  6. #include<string.h>
  7.  
  8. unsigned long long values[5001];
  9. unsigned long long heap[100001];
  10.  
  11. int size = 0;
  12. int actual = 0;
  13.  
  14. //funkcie na orientovanie sa v halde
  15. int parent(int n)
  16. {
  17. return n/2;
  18. }
  19.  
  20. int leftLeaf(int n)
  21. {
  22. return 2*n;
  23. }
  24.  
  25. int rightLeaf(int n)
  26. {
  27. return 2*n + 1;
  28. }
  29.  
  30. unsigned long top()
  31. {
  32. return size>0 ? heap[0] : -1;
  33. }
  34.  
  35. unsigned long long pop()
  36. {
  37. unsigned long long target = top();
  38. heap[0] = heap[--size];
  39. heapify(0);
  40. return target;
  41. }
  42.  
  43.  
  44. //funkcia na vymenu prvkov
  45. void swapElement(unsigned long long *a, unsigned long long *b)
  46. {
  47. unsigned long long pom = *a;
  48. *a = *b;
  49. *b = pom;
  50. }
  51.  
  52. void heapInsert(unsigned long long key)
  53. {
  54. size++; // velkost heapu
  55. int act = size-1;
  56. while(heap[parent(act)] > key && act > 0)
  57. {
  58. heap[act] = heap[parent(act)];
  59. act = parent(act);
  60. }
  61. heap[act] = key;
  62. }
  63.  
  64. void heapify(int act)
  65. {
  66. int left = leftLeaf(act);
  67. int right = rightLeaf(act);
  68. int largest = 0;
  69. if(left < size && heap[left] < heap[act])
  70. {
  71. largest = left;
  72. }
  73. else
  74. {
  75. largest = act;
  76. }
  77. if(right < size && heap[right] < heap[largest])
  78. {
  79. largest = right;
  80. }
  81. if(largest != act)
  82. {
  83. swapElement(&heap[act], &heap[largest]);
  84. heapify(largest);
  85. }
  86. }
  87.  
  88. //funkcia ktora nam predpocita jednotlive prvky
  89. void precalc()
  90. {
  91. if(actual > 5000)
  92. return;
  93. unsigned long actVal = pop();
  94. if(actVal > values[actual-1])
  95. {
  96. values[actual++] = actVal;
  97. heapInsert(actVal * 3LL);
  98. heapInsert(actVal * 5LL);
  99. heapInsert(actVal * 7LL);
  100. }
  101. precalc();
  102. }
  103.  
  104. int main()
  105. {
  106. int n;
  107. heapInsert(1);
  108. precalc();
  109. while(scanf("%d",&n) == 1)
  110. {
  111. printf("%llu\n", values[n-1]);
  112. }
  113. return 0;
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement