Advertisement
Motocelium

Restaurant Fast Food

Nov 22nd, 2024 (edited)
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.36 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define MIN(a, b) ((a) < (b) ? (a) : (b)) // functie care calculeaza minimul
  6.  
  7. typedef struct nod{
  8.     int timp;
  9.     char nume[30];
  10.     struct nod *next;
  11. }NOD;
  12.  
  13. NOD *creare_nod(){
  14.     NOD *nod_nou = malloc(sizeof(NOD)); // alocam memorie
  15.     scanf("%d%s", &nod_nou -> timp, nod_nou -> nume); // citim valorile
  16.     nod_nou -> next = NULL;
  17.     return nod_nou;
  18. }
  19.  
  20. NOD *adauga_comanda(NOD *head){
  21.     NOD *nod_nou = creare_nod();
  22.     if(head == NULL) // verificam daca lista e goala
  23.         return nod_nou;
  24.    
  25.     NOD *nod = head;
  26.     while(nod->next)//parcurgem lista pana ajungem la ultimul element
  27.         nod = nod->next;
  28.     nod -> next = nod_nou; // adaugam elementul la finalul listei
  29.     return head;
  30. }
  31.  
  32. NOD *gatire_aragaz(NOD *aragaz, int t){ // functia simuleaza folosirea unui aragaz
  33.     NOD *nod = aragaz;
  34.     if(nod == NULL){
  35.         return nod;
  36.     }
  37.     nod -> timp -= t;
  38.     if(nod -> timp == 0){ // comanda e finalizata
  39.         printf("%s\n", aragaz -> nume);
  40.         aragaz = aragaz -> next; // eliberam aragazul
  41.         free(nod);
  42.     }
  43.     return aragaz;
  44. }
  45.  
  46. void urmatoarea_comanda(NOD **comenzi, NOD **aragaz){
  47.     NOD *nod = NULL;
  48.     // verificam daca aragazul este liber
  49.     if(*aragaz == NULL && *comenzi){
  50.         // daca e liber, alocam memorie si punem in pregatire primul element din lista de comenzi
  51.         (*aragaz) = malloc(sizeof(NOD));
  52.         strcpy((*aragaz) -> nume, (*comenzi)->nume);
  53.         (*aragaz) -> timp = (*comenzi) -> timp;
  54.         (*aragaz) -> next = NULL;
  55.        
  56.         nod = *comenzi;
  57.         *comenzi = (*comenzi)->next; // actualizam lista de comenzi
  58.         free(nod); // eliberam memoria pentru comanda in pregatire
  59.     }
  60. }
  61.  
  62. void urmatoarea_comanda_caz2(NOD **comenzi, NOD **aragaz, int cond) {
  63.     // Verificăm dacă aragazul este liber și există comenzi
  64.     if (*aragaz == NULL && *comenzi) {
  65.         // Dacă prima comandă satisface condiția, o preluăm
  66.         if ((cond && (*comenzi)->timp <= 15) || (!cond && (*comenzi)->timp > 15)) {
  67.             *aragaz = *comenzi;
  68.             *comenzi = (*comenzi)->next;
  69.             (*aragaz)->next = NULL;  // Eliminăm conexiunea nodului cu lista
  70.         } else {
  71.             // Parcurgem lista pentru a găsi o comandă care satisface condiția
  72.             NOD *prev = *comenzi;
  73.             NOD *current = (*comenzi)->next;
  74.  
  75.             while (current) {
  76.                 if ((cond && current->timp <= 15) || (!cond && current->timp > 15)) {
  77.                     *aragaz = current;        // Mutăm nodul pe aragaz
  78.                     prev->next = current->next; // Sărim peste nodul selectat
  79.                     (*aragaz)->next = NULL;  // Eliminăm conexiunea nodului cu lista
  80.                     break;
  81.                 }
  82.                 prev = current;
  83.                 current = current->next;
  84.             }
  85.         }
  86.     }
  87. }
  88.  
  89.  
  90. int verif(NOD *a1, NOD *a2, NOD *a3){
  91.     if(a1 && a2 && a3) return 1;   // Toate ocupate
  92.     if(a1 && a2 == NULL && a3 == NULL) return 5;   // Doar a1 ocupat
  93.     if(a1 == NULL && a2 && a3 == NULL) return 6;   // Doar a2 ocupat
  94.     if(a1 == NULL && a2 == NULL && a3) return 7;   // Doar a3 ocupat
  95.     if(a1 && a2 == NULL && a3) return 3;   // A1 și A3 ocupate
  96.     if(a1 && a2 == NULL && a3 == NULL) return 5;   // Doar A1 ocupat
  97.     if(a1 == NULL && a2 && a3 == NULL) return 6;   // Doar A2 ocupat
  98.     return 4;   // Toate goale sau o combinație
  99. }
  100.  
  101. void gateste(NOD **comenzi, int timp, int tip, NOD **aragaz1, NOD **aragaz2, NOD **aragaz3){
  102.     NOD *nod = NULL;
  103.     switch(tip){
  104.         // un singur aragaz
  105.         case 0:{
  106.             while(timp && (comenzi || aragaz1)){
  107.                 urmatoarea_comanda(comenzi, aragaz1);
  108.                 int t = MIN((*aragaz1)->timp, timp);
  109.                 timp -= t;
  110.                 *aragaz1 = gatire_aragaz(*aragaz1, t);
  111.             }
  112.             break;
  113.         }
  114.         // 3 aragazuri
  115.         case 1:{
  116.             while(timp > 0 && (*comenzi || *aragaz1 || *aragaz2 || *aragaz3)){
  117.                 urmatoarea_comanda(comenzi, aragaz1);
  118.                 urmatoarea_comanda(comenzi, aragaz2);
  119.                 urmatoarea_comanda(comenzi, aragaz3);
  120.  
  121.                 int t = MIN((*aragaz1 ? (*aragaz1)->timp : 1000000),
  122.                             MIN((*aragaz2 ? (*aragaz2)->timp : 1000000),
  123.                                 (*aragaz3 ? (*aragaz3)->timp : 10000000)));
  124.  
  125.                 // Determină pentru ce timp actualizam procesul
  126.                 t = MIN(t, timp);
  127.                
  128.                 if (*aragaz1) *aragaz1 = gatire_aragaz(*aragaz1, t);
  129.                 if (*aragaz2) *aragaz2 = gatire_aragaz(*aragaz2, t);
  130.                 if (*aragaz3) *aragaz3 = gatire_aragaz(*aragaz3, t);
  131.  
  132.                 timp -= t;
  133.             }
  134.             break;
  135.         }
  136.         // 2 aragazuri + unul pentru comezni <= 15 minute
  137.         case 2:{
  138.             while(timp > 0 && (*comenzi || *aragaz1 || *aragaz2 || *aragaz3)){
  139.                 //aragazul 1 este pentru comenzi <= 15 minute
  140.                 urmatoarea_comanda_caz2(comenzi, aragaz1, 1);
  141.                 urmatoarea_comanda_caz2(comenzi, aragaz2, 0);
  142.                 urmatoarea_comanda_caz2(comenzi, aragaz3, 0);
  143.  
  144.                 int t = MIN((*aragaz1 ? (*aragaz1)->timp : 1000000),
  145.                             MIN((*aragaz2 ? (*aragaz2)->timp : 1000000),
  146.                                 (*aragaz3 ? (*aragaz3)->timp : 10000000)));
  147.  
  148.                 // Determină pentru ce timp actualizam procesul
  149.                 t = MIN(t, timp);
  150.                
  151.                 if (*aragaz1) *aragaz1 = gatire_aragaz(*aragaz1, t);
  152.                 if (*aragaz2) *aragaz2 = gatire_aragaz(*aragaz2, t);
  153.                 if (*aragaz3) *aragaz3 = gatire_aragaz(*aragaz3, t);
  154.  
  155.                 timp -= t;
  156.             }
  157.             break;
  158.         }
  159.         default:
  160.             break;
  161.     }
  162. }
  163.  
  164. void timp_comanda(NOD *head, NOD *a1, NOD *a2, NOD *a3){
  165.     if(a1 || a2 || a3){
  166.         if(a1 && a2 == NULL && a3 == NULL)
  167.             printf("%d\n", a1->timp);
  168.         else if(a1 == NULL && a2 && a3 == NULL)
  169.             printf("%d\n", a2->timp);
  170.         else if(a1 == NULL && a2 == NULL && a3)
  171.             printf("%d\n", a3->timp);
  172.         else if(a1 && a2 && a3 == NULL)
  173.             printf("%d\n", MIN(a2->timp, a1->timp));
  174.         else if(a1 && a2 == NULL && a3)
  175.             printf("%d\n", MIN(a3->timp, a1->timp));
  176.         else if(a1 == NULL && a2 && a3)
  177.             printf("%d\n", MIN(a2->timp, a3->timp));
  178.         else
  179.             printf("%d\n", MIN(a2->timp, MIN(a1->timp, a3->timp)));
  180.     }
  181.     else if(head)
  182.         printf("%d\n", head->timp);
  183.     else
  184.         printf("Nu avem comenzi in pregatire\n");
  185. }
  186.  
  187. int main(){
  188.     char comanda;
  189.     int tip_restaurant;
  190.     NOD *comenzi = NULL, *aragaz1 = NULL, *aragaz2 = NULL, *aragaz3 = NULL;
  191.    
  192.     scanf("%d", &tip_restaurant);
  193.     getchar(); // citim '\n'
  194.    
  195.     while((comanda = getchar())!= EOF){
  196.         if(comanda == '+'){
  197.             comenzi = adauga_comanda(comenzi);
  198.            
  199.         }
  200.         else if(comanda == '-'){
  201.             int timp;
  202.             scanf("%d", &timp);
  203.             gateste(&comenzi, timp, tip_restaurant, &aragaz1, &aragaz2, &aragaz3);
  204.         }
  205.         else if(comanda == '?'){
  206.             timp_comanda(comenzi, aragaz1, aragaz2, aragaz3);
  207.         }
  208.     }
  209.    
  210.     return 0;
  211. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement