Advertisement
Guest User

Untitled

a guest
Mar 26th, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.35 KB | None | 0 0
  1. // Schrage_podzial.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <iostream>
  6. #include <conio.h>
  7. #include <fstream>
  8. #include <stdio.h>
  9. #include <string>
  10. #include <algorithm>
  11. #include <Windows.h>
  12. #include<queue>
  13.  
  14.  
  15.  
  16.  
  17.  
  18. using namespace std;
  19. int n; //Zmienna globalna przechowujaca ilosc;
  20. int c[1002]; //tablica przechowujaca kolejne wartosc C
  21.  
  22. struct wartosc {
  23.  
  24.     int ri;
  25.     int pi;
  26.     int qi;
  27.  
  28. };
  29.  
  30. struct PorownajWartosci1 {
  31.  
  32.     bool operator()(const wartosc & war1, const wartosc & war2)
  33.  
  34.     {
  35.         if (war1.ri >war2.ri) return true;
  36.         if (war1.ri < war2.ri) return false;
  37.         return false;
  38.     }
  39.  
  40. };
  41.  
  42. struct PorownajWartosci2 {
  43.  
  44.     bool operator()(const wartosc & war1, const wartosc & war2)
  45.     {
  46.  
  47.         if (war1.qi < war2.qi) return true;
  48.         if (war1.qi > war2.qi) return false;
  49.         return false;
  50.  
  51.     }
  52.  
  53.  
  54. };
  55.  
  56. typedef priority_queue<wartosc, vector<wartosc>, PorownajWartosci2>G;
  57. typedef priority_queue<wartosc, vector<wartosc>, PorownajWartosci1>N;
  58.  
  59. void WstawWartosc1(N & kolejka, int ri, int pi, int qi)
  60. {
  61.     wartosc war;
  62.     war.ri = ri;
  63.     war.pi = pi;
  64.     war.qi = qi;
  65.     kolejka.push(war);
  66. }
  67. void WstawWartosc2(G & kolejka, int ri, int pi, int qi)
  68. {
  69.     wartosc war;
  70.     war.ri = ri;
  71.     war.pi = pi;
  72.     war.qi = qi;
  73.     kolejka.push(war);
  74. }
  75.  
  76. void wczytaj(int Tab[1001][3])
  77. {
  78.  
  79.     string nazwa_pliku;
  80.     fstream plik;
  81.  
  82.  
  83.     //Wczytanie nazwy
  84.     cout << "Podaj nazwe pliku do otwarcia" << endl;
  85.     cin >> nazwa_pliku;
  86.  
  87.     plik.open(nazwa_pliku, ios::in);    //Utorzenie pliku i sprawdzenie czy udalo sie go otworzyc
  88.  
  89.     if (plik.good() == false)
  90.     {
  91.         cout << "Nie mozna otworzyc pliku!" << endl;
  92.     };
  93.  
  94.     plik >> n;   // Wczytanie ilosci wierszy
  95.  
  96.  
  97.  
  98.     for (int i = 0; i<n; i++)   //Wczytanie wartosci z pliku do tablicy
  99.     {
  100.  
  101.         for (int j = 0; j < 3; j++)
  102.         {
  103.             plik >> Tab[i][j];
  104.         }
  105.  
  106.     }
  107.  
  108.     plik.close();
  109. };
  110.  
  111.  
  112.  
  113. void wyswietl(int Tab[1001][3]) //Funkcja pozwalajaca na wyswietlanie zawartosci tablicy
  114. {
  115.  
  116.     for (int i = 0; i < n; ++i)
  117.     {
  118.         for (int j = 0; j < 3; ++j)
  119.             cout << Tab[i][j] << " ";
  120.         cout << "\n";
  121.     }
  122.  
  123. };
  124.  
  125.  
  126.  
  127. void czysc_ekran() //Funkcja czyszczaca ekran
  128. {
  129.     Sleep(1500);
  130.     system("CLS");
  131. };
  132.  
  133.  
  134. int main()
  135. {
  136.     int t = 0;   //chwila czasowa
  137.     int k = 0;
  138.     int Cmax = 0;
  139.    
  140.     wartosc PI;
  141.     wartosc e;        //nowe zadanie
  142.     wartosc l;      //zadanie aktualnie wykonywane
  143.  
  144.     e.ri = 0;
  145.     e.pi = 0;
  146.     e.qi = 0;
  147.  
  148.     l.ri = 0;
  149.     l.pi = 0;
  150.     l.qi = 99999999999;     //Podstawiamy duza wartosc by algorytm sie nie przerwal
  151.  
  152.     G G1;
  153.     N N1;
  154.  
  155.  
  156.     int ri;     //termin dosteponosci
  157.     int pi;     //czas wykonania zadania
  158.     int qi;     //czas dostarczenia zadania
  159.  
  160.  
  161.  
  162.  
  163.     int Tab_Dane[1001][3];  //Tablica ktora bedzie przechowywac dane
  164.     wartosc odczyt;
  165.  
  166.     wczytaj(Tab_Dane);
  167.  
  168.  
  169.  
  170.  
  171.     for (int i = 0; i < n; i++)
  172.     {
  173.  
  174.         ri = Tab_Dane[i][0];
  175.         pi = Tab_Dane[i][1];
  176.         qi = Tab_Dane[i][2];
  177.         WstawWartosc1(N1, ri, pi, qi);
  178.  
  179.     }
  180.  
  181.     odczyt = N1.top();
  182.  
  183.  
  184.  
  185.     while (!G1.empty() || !N1.empty())
  186.     {
  187.         while ((!N1.empty()) && (N1.top().ri <= t))      
  188.         {                                                   //umieszcznie zdan gotowych do razlicaji w chwili t
  189.                                                             // zdania ktorych temin dostepnosci ri jes mniejszy rowny od t
  190.             wartosc e = N1.top();
  191.             WstawWartosc2(G1, e.ri, e.pi, e.qi);
  192.             N1.pop();          
  193.             if (e.qi > l.qi)                  //Sprawdzamy czy dodane zadania do zbioru ma wiekszy czas dostarczania od zadania aktualnego                         
  194.             {                               //Jesli tak to przerywamy zadnie
  195.                 l.pi = t - e.ri;            //Obliczamy nowy czas wykonania zadania
  196.                 t = e.ri;                   //Obliczamy nowy czas dostępnosci zadnia
  197.                 if (l.pi > 0)
  198.                 {
  199.                     WstawWartosc2(G1, l.ri, l.pi, l.qi);       //Niewykonana czesc zadania dodajemy do zbioru zadan gotowych do realizacji
  200.                 };
  201.             };
  202.         }
  203.  
  204.         if (G1.empty())                    //sprawdz czy zbior zadan nie jest przypadkiem pusty
  205.         {
  206.             t = N1.top().ri;            //jesli tak to przesuwamy chwile czasowa do momentu dostepnosci nawczensijszego zadania ze zbioru N
  207.         }
  208.  
  209.         else {
  210.  
  211.             e = G1.top();                   //wyznaczamy zadanie o największym qi w zbiorze G
  212.             G1.pop();                       //i je usuwamy z tego zbioru
  213.             l = e;                          //uaktualnimy zmienna l
  214.             t = t + e.pi;                   //zwiekszamy chwile czasowa o czas realizacji zadania ( moment  zakonczenia zadania )
  215.             Cmax = max(Cmax, t + e.qi);     //uaktualniamy napozniejszy moment dostarczenia
  216.         }
  217.  
  218.  
  219.     }
  220.  
  221.     czysc_ekran();
  222.     cout << "Cmax=  " << Cmax << endl;
  223.  
  224.  
  225.     _getch();
  226.     return 0;
  227. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement