Advertisement
madalinaradu

P23 - planificare taskuri

May 26th, 2019
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.41 KB | None | 0 0
  1. //Problema planificarii lucrailor cu termen final.
  2.  
  3. #include<iostream>
  4. #include<iomanip>
  5. #include<string.h>
  6. using namespace std;
  7.  
  8. struct Task {
  9.  
  10.     char id;
  11.     int deadline;
  12.     int profit;
  13.  
  14.     void afisare() {
  15.         cout<<setw(6)<<id;
  16.         cout<<setw(6)<<deadline;
  17.         cout<<setw(6)<<profit;
  18.         cout<<endl;
  19.     }
  20. };
  21.  
  22. Task t[100]= {
  23.     {'a', 2, 100},
  24.     {'b', 1, 19},
  25.     {'c', 1, 27},
  26.     {'d', 1, 25},
  27.     {'e', 3, 15}
  28. };
  29.  
  30.  
  31. int n = 5; //nr de taskuri
  32.  
  33. Task planificate[100];
  34.  
  35. /**
  36.   Ordoneaza descrescator taskurile din tabloul t[] dupa profit.
  37.  
  38. */
  39. void sortare(int n, Task t[]) {
  40.     int i,j;
  41.     Task tmp;
  42.     for(i=0; i<n-1; i++) {
  43.         for(j= i+1; j<n; j++) {
  44.             if(t[i].profit<t[j].profit) {
  45.                 tmp = t[i];
  46.                 t[i] = t[j];
  47.                 t[j] = tmp;
  48.             }
  49.         }
  50.     }
  51. }
  52.  
  53. /**
  54.  Afiseaza un tablou de taskuri.
  55. */
  56. void afisare(int n, Task t[]) {
  57.     int i;
  58.     for(i=0; i<n; i++) {
  59.         t[i].afisare();
  60.     }
  61. }
  62.  
  63.  
  64. /**
  65. * Avem planificate taskurile p[1].deadline <= p[2].deadline <= ...  <= p[k].deadline si dorim sa planificam 'task' astefel incat
  66. *
  67. * p[0].deadline <= p[1].deadline <= ...<=task.deadline <= t[j].deadline...  <= p[k].deadline
  68. *
  69. *
  70. * Functia verifica daca 'task' poate fi ales pentru planificare:
  71. * - daca timpul inca nu i-a expirat atunci poate fi adaugat la sfirsit
  72. * - altfel se incearca decalarea taskurilor deja planificate cu o pozitie(daca este posibil),
  73. *    astfel incat si 'task' sa se incadreze in timp.
  74. *
  75. * @param task - task-ul aflat sub evaluare
  76. * @param k - numarul de taskuri deja alese pana in momentul curent
  77. * @param j - pozitia une ar putea fi inserat task-ul
  78. */
  79. bool posibil(Task task, int k, int &j) {
  80.     int q; // flag care spune cand ma opresc din cautare
  81.     j = k; //pornesc de la sfarsit spre inceput sa ii gasesc un loc
  82.     q = 0;
  83.     while (j >= 1 && q == 0){
  84.         if (planificate[j].deadline <= task.deadline)
  85.             q = 1; // am gasit o pozitie unde se poate insera
  86.         else if (j == planificate[j].deadline)
  87.                 q = 2; // nu mai pot decala lucrarile
  88.             else
  89.                 j--;
  90.     }
  91.     j++;
  92.     if (j <= task.deadline)
  93.         return true; //pot sa programez taskul la ora j
  94.     return false;
  95. }
  96. /**
  97. * Se incearca pentru fiecare task sa-i fie gasit un loc in sirul de taskuri
  98. * deja alese daca este posibil.
  99. */
  100. void calcul() {
  101.     int i, j, k, p;
  102.     k = 1; ///se programeaza din start primul task cu castigul cel mai mare  t[0]
  103.     planificate[k] = t[0];
  104.     for (i = 1; i < n; i++) {
  105.         ///se verifica daca lucrarea t[i] poate fi inserata in sirul cu taskurile planificate
  106.         if (posibil(t[i], k, p)) { ///verific daca taskul t[i] poate fi programat avand deja programate k taskuri (existente in planificate). p va fi pozitia unde se va programa
  107.             ///se decaleaza lucrarile intre p si k cu o pozitie spre dreapta
  108.             for (j = k; j >= p; j--)
  109.                 planificate[j + 1] = planificate[j];
  110.             planificate[p] = t[i]; ///planific taskul la ora p
  111.             k++; /// cresc numarul de taskuri planificate
  112.         }
  113.     }
  114.  
  115.     //afisare rezultate
  116.     for (i = 1; i <= k; i++){
  117.         cout<< "La momentul "<< i << " se va executa task-ul";
  118.         planificate[i].afisare();
  119.     }
  120. }
  121.  
  122.  
  123.  
  124. int main() {
  125.     sortare(n, t);
  126.     afisare(n,t);
  127.     calcul();
  128.     return 0;
  129. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement