// Zadanie: Szeregowanie zadan [B]
// Autor: Arkadiusz Roussau
#include <algorithm>
#include <iostream>
#include <utility>
#include <cstdio>
#include <queue>
using namespace std;
const int MAX_CZAS = 1000002;
const int MAX_PROCESOW = 102;
bool TAB[MAX_CZAS][MAX_PROCESOW];
int LICZNIK[MAX_CZAS], KOSZT[MAX_PROCESOW], CZAS[MAX_PROCESOW], p, k, c, max_k = -1, swob;
int zadania, procesory;
pair<int, int> para;
int main() {
scanf("%d %d", &zadania, &procesory);
for (int i = 0; i < zadania; ++i) {
scanf("%d %d %d", &p, &k, &c);
for (int j = p; j < k; ++j) {
TAB[j][i] = true;
LICZNIK[j]++;
}
CZAS[i] = k - p;
KOSZT[i] = c;
max_k = max(max_k, k);
}
for (int i = 0; i < max_k; ++i) {
if (LICZNIK[i] <= procesory) {
for (int j = 0; j < zadania; ++j) {
if(TAB[i][j]) {
KOSZT[j]--;
CZAS[j]--;
}
}
}
}
for (int i = 0; i < max_k; ++i) {
if (LICZNIK[i] > procesory) {
priority_queue< pair<int , int> > Q;
for (int j = 0; j < zadania; ++j) {
if ((TAB[i][j]) && (0 < KOSZT[j])) {
CZAS[j]--;
swob = -(CZAS[j] - KOSZT[j]);
Q.push(make_pair(swob, j));
}
}
for (int j = 0; j < procesory; ++j) {
if(Q.empty()) {
break;
}
KOSZT[Q.top().second]--;
Q.pop();
}
}
}
for (int i = 0; i < zadania; ++i) {
if (0 < KOSZT[i]) {
printf("NIE");
return 0;
}
}
printf("TAK");
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | // Zadanie: Szeregowanie zadan [B] // Autor: Arkadiusz Roussau #include <algorithm> #include <iostream> #include <utility> #include <cstdio> #include <queue> using namespace std; const int MAX_CZAS = 1000002; const int MAX_PROCESOW = 102; bool TAB[MAX_CZAS][MAX_PROCESOW]; int LICZNIK[MAX_CZAS], KOSZT[MAX_PROCESOW], CZAS[MAX_PROCESOW], p, k, c, max_k = -1, swob; int zadania, procesory; pair<int, int> para; int main() { scanf("%d %d", &zadania, &procesory); for (int i = 0; i < zadania; ++i) { scanf("%d %d %d", &p, &k, &c); for (int j = p; j < k; ++j) { TAB[j][i] = true; LICZNIK[j]++; } CZAS[i] = k - p; KOSZT[i] = c; max_k = max(max_k, k); } for (int i = 0; i < max_k; ++i) { if (LICZNIK[i] <= procesory) { for (int j = 0; j < zadania; ++j) { if(TAB[i][j]) { KOSZT[j]--; CZAS[j]--; } } } } for (int i = 0; i < max_k; ++i) { if (LICZNIK[i] > procesory) { priority_queue< pair<int , int> > Q; for (int j = 0; j < zadania; ++j) { if ((TAB[i][j]) && (0 < KOSZT[j])) { CZAS[j]--; swob = -(CZAS[j] - KOSZT[j]); Q.push(make_pair(swob, j)); } } for (int j = 0; j < procesory; ++j) { if(Q.empty()) { break; } KOSZT[Q.top().second]--; Q.pop(); } } } for (int i = 0; i < zadania; ++i) { if (0 < KOSZT[i]) { printf("NIE"); return 0; } } printf("TAK"); return 0; } |
English