Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Schrage_podzial.cpp : Defines the entry point for the console application.
- //
- #include "stdafx.h"
- #include <iostream>
- #include <conio.h>
- #include <fstream>
- #include <stdio.h>
- #include <string>
- #include <algorithm>
- #include <Windows.h>
- #include<queue>
- using namespace std;
- int n; //Zmienna globalna przechowujaca ilosc;
- int c[1002]; //tablica przechowujaca kolejne wartosc C
- struct wartosc {
- int ri;
- int pi;
- int qi;
- };
- struct PorownajWartosci1 {
- bool operator()(const wartosc & war1, const wartosc & war2)
- {
- if (war1.ri >war2.ri) return true;
- if (war1.ri < war2.ri) return false;
- return false;
- }
- };
- struct PorownajWartosci2 {
- bool operator()(const wartosc & war1, const wartosc & war2)
- {
- if (war1.qi < war2.qi) return true;
- if (war1.qi > war2.qi) return false;
- return false;
- }
- };
- typedef priority_queue<wartosc, vector<wartosc>, PorownajWartosci2>G;
- typedef priority_queue<wartosc, vector<wartosc>, PorownajWartosci1>N;
- void WstawWartosc1(N & kolejka, int ri, int pi, int qi)
- {
- wartosc war;
- war.ri = ri;
- war.pi = pi;
- war.qi = qi;
- kolejka.push(war);
- }
- void WstawWartosc2(G & kolejka, int ri, int pi, int qi)
- {
- wartosc war;
- war.ri = ri;
- war.pi = pi;
- war.qi = qi;
- kolejka.push(war);
- }
- void wczytaj(int Tab[1001][3])
- {
- string nazwa_pliku;
- fstream plik;
- //Wczytanie nazwy
- cout << "Podaj nazwe pliku do otwarcia" << endl;
- cin >> nazwa_pliku;
- plik.open(nazwa_pliku, ios::in); //Utorzenie pliku i sprawdzenie czy udalo sie go otworzyc
- if (plik.good() == false)
- {
- cout << "Nie mozna otworzyc pliku!" << endl;
- };
- plik >> n; // Wczytanie ilosci wierszy
- for (int i = 0; i<n; i++) //Wczytanie wartosci z pliku do tablicy
- {
- for (int j = 0; j < 3; j++)
- {
- plik >> Tab[i][j];
- }
- }
- plik.close();
- };
- void wyswietl(int Tab[1001][3]) //Funkcja pozwalajaca na wyswietlanie zawartosci tablicy
- {
- for (int i = 0; i < n; ++i)
- {
- for (int j = 0; j < 3; ++j)
- cout << Tab[i][j] << " ";
- cout << "\n";
- }
- };
- void czysc_ekran() //Funkcja czyszczaca ekran
- {
- Sleep(1500);
- system("CLS");
- };
- int main()
- {
- int t = 0; //chwila czasowa
- int k = 0;
- int Cmax = 0;
- wartosc PI;
- wartosc e; //nowe zadanie
- wartosc l; //zadanie aktualnie wykonywane
- e.ri = 0;
- e.pi = 0;
- e.qi = 0;
- l.ri = 0;
- l.pi = 0;
- l.qi = 99999999999; //Podstawiamy duza wartosc by algorytm sie nie przerwal
- G G1;
- N N1;
- int ri; //termin dosteponosci
- int pi; //czas wykonania zadania
- int qi; //czas dostarczenia zadania
- int Tab_Dane[1001][3]; //Tablica ktora bedzie przechowywac dane
- wartosc odczyt;
- wczytaj(Tab_Dane);
- for (int i = 0; i < n; i++)
- {
- ri = Tab_Dane[i][0];
- pi = Tab_Dane[i][1];
- qi = Tab_Dane[i][2];
- WstawWartosc1(N1, ri, pi, qi);
- }
- odczyt = N1.top();
- while (!G1.empty() || !N1.empty())
- {
- while ((!N1.empty()) && (N1.top().ri <= t))
- { //umieszcznie zdan gotowych do razlicaji w chwili t
- // zdania ktorych temin dostepnosci ri jes mniejszy rowny od t
- wartosc e = N1.top();
- WstawWartosc2(G1, e.ri, e.pi, e.qi);
- N1.pop();
- if (e.qi > l.qi) //Sprawdzamy czy dodane zadania do zbioru ma wiekszy czas dostarczania od zadania aktualnego
- { //Jesli tak to przerywamy zadnie
- l.pi = t - e.ri; //Obliczamy nowy czas wykonania zadania
- t = e.ri; //Obliczamy nowy czas dostępnosci zadnia
- if (l.pi > 0)
- {
- WstawWartosc2(G1, l.ri, l.pi, l.qi); //Niewykonana czesc zadania dodajemy do zbioru zadan gotowych do realizacji
- };
- };
- }
- if (G1.empty()) //sprawdz czy zbior zadan nie jest przypadkiem pusty
- {
- t = N1.top().ri; //jesli tak to przesuwamy chwile czasowa do momentu dostepnosci nawczensijszego zadania ze zbioru N
- }
- else {
- e = G1.top(); //wyznaczamy zadanie o największym qi w zbiorze G
- G1.pop(); //i je usuwamy z tego zbioru
- l = e; //uaktualnimy zmienna l
- t = t + e.pi; //zwiekszamy chwile czasowa o czas realizacji zadania ( moment zakonczenia zadania )
- Cmax = max(Cmax, t + e.qi); //uaktualniamy napozniejszy moment dostarczenia
- }
- }
- czysc_ekran();
- cout << "Cmax= " << Cmax << endl;
- _getch();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement