#include <stdio.h>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;
struct Task {
	int start;
	int end;
	int to_allocate;
	int empty_slots;
};
struct Comp {
	bool operator()(Task t1, Task t2) // is t1 less than t2?
	{
		if (t1.empty_slots < t2.empty_slots) {
			return true;
		}
		if (t1.empty_slots > t2.empty_slots) {
			return false;
		}
		return false;
	}
} my_comp;
template <class ForwardIterator>
std::size_t min_element_index(ForwardIterator first, ForwardIterator last, Comp comp)
{
	ForwardIterator lowest = first;
	std::size_t index = 0;
	std::size_t i = 0;
	if (first == last) return index;
	while (++first != last) {
		++i;
		if (comp(*first,*lowest)) {
			lowest = first;
			index = i;
		}
	}
	return index;
}
short free_cpus[1000001];
int main()
{
	int n, m;
	scanf("%ld %ld", &n, &m);
	vector<Task> tasks;
	int max_time = 0;
	for (int i = 0; i < n; i++)
	{
		int v1, v2, v3;
		scanf("%ld %ld %ld", &v1, &v2, &v3);
		
		Task t;
		t.start = v1;
		t.end = v2 - 1;
		t.to_allocate = v3;
		t.empty_slots = v2 - v1 - v3;
		tasks.push_back(t);
		if (t.end > max_time) {
			max_time = t.end;
		}
	}
	for (int i = 0; i <= max_time; i++)
	{
		free_cpus[i] = m;
	}
	while (tasks.size() > 0) {
		int min_task_index = min_element_index(tasks.begin(), tasks.end(), my_comp);
		Task min_task = tasks[min_task_index];
		int allocated = 0;
		for (int i = min_task.start; i <= min_task.end; i++)
		{
			if (allocated < min_task.to_allocate && free_cpus[i] > 0) {
				// allocate CPU
				free_cpus[i]--;
				allocated++;
				if (free_cpus[i] == 0) {
					// remove time slot
					for (int j = 0; j < tasks.size(); j++) {
						if (j != min_task_index && tasks[j].start <= i && tasks[j].end >= i) {
							tasks[j].empty_slots--;
							if (tasks[j].empty_slots < 0) {
								// FAILED
								printf("NIE\n");
								return 0;
							}
						}
					}
				}
			}
			
			if (allocated == min_task.to_allocate)
			{
				break;
			}
		}
		if (allocated < min_task.to_allocate) {
			// FAILED
			printf("NIE\n");
			return 0;
		}
		tasks.erase(tasks.begin() + min_task_index);
	}
	// SUCCEEDED
	printf("TAK\n");
	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 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | #include <stdio.h> #include <set> #include <vector> #include <algorithm> using namespace std; struct Task { int start; int end; int to_allocate; int empty_slots; }; struct Comp { bool operator()(Task t1, Task t2) // is t1 less than t2? { if (t1.empty_slots < t2.empty_slots) { return true; } if (t1.empty_slots > t2.empty_slots) { return false; } return false; } } my_comp; template <class ForwardIterator> std::size_t min_element_index(ForwardIterator first, ForwardIterator last, Comp comp) { ForwardIterator lowest = first; std::size_t index = 0; std::size_t i = 0; if (first == last) return index; while (++first != last) { ++i; if (comp(*first,*lowest)) { lowest = first; index = i; } } return index; } short free_cpus[1000001]; int main() { int n, m; scanf("%ld %ld", &n, &m); vector<Task> tasks; int max_time = 0; for (int i = 0; i < n; i++) { int v1, v2, v3; scanf("%ld %ld %ld", &v1, &v2, &v3); Task t; t.start = v1; t.end = v2 - 1; t.to_allocate = v3; t.empty_slots = v2 - v1 - v3; tasks.push_back(t); if (t.end > max_time) { max_time = t.end; } } for (int i = 0; i <= max_time; i++) { free_cpus[i] = m; } while (tasks.size() > 0) { int min_task_index = min_element_index(tasks.begin(), tasks.end(), my_comp); Task min_task = tasks[min_task_index]; int allocated = 0; for (int i = min_task.start; i <= min_task.end; i++) { if (allocated < min_task.to_allocate && free_cpus[i] > 0) { // allocate CPU free_cpus[i]--; allocated++; if (free_cpus[i] == 0) { // remove time slot for (int j = 0; j < tasks.size(); j++) { if (j != min_task_index && tasks[j].start <= i && tasks[j].end >= i) { tasks[j].empty_slots--; if (tasks[j].empty_slots < 0) { // FAILED printf("NIE\n"); return 0; } } } } } if (allocated == min_task.to_allocate) { break; } } if (allocated < min_task.to_allocate) { // FAILED printf("NIE\n"); return 0; } tasks.erase(tasks.begin() + min_task_index); } // SUCCEEDED printf("TAK\n"); return 0; } | 
 
            
         English
                    English