#include <cstdio> #include <vector> #include <algorithm> struct task { int available_delay; int work_left; bool operator<(const task& rhs) const { if (available_delay < rhs.available_delay) { return true; } return false; } }; int main() { int n, m; scanf("%d%d", &n, &m); int p, k, c; std::vector<task> active_tasks; std::vector<std::pair<int, task> > all_tasks; int begin = 1000 * 1000; int end = 0; for (int i = 0; i < n; i++) { task currentTask; scanf("%d%d%d", &p, &k, &c); currentTask.available_delay = k - p - c; currentTask.work_left = c; all_tasks.push_back(std::make_pair(p, currentTask)); begin = std::min(begin, p); end = std::max(end, k); } std::sort(all_tasks.begin(), all_tasks.end()); int next_task_position = 0; for (int i = begin; i <= end; i++) { while (next_task_position < all_tasks.size() && all_tasks[next_task_position].first == i) { active_tasks.push_back(all_tasks[next_task_position].second); next_task_position++; } std::sort(active_tasks.begin(), active_tasks.end()); for (int j = 0; j < std::min(m, (int) active_tasks.size()); j++) { active_tasks[j].work_left--; } if (active_tasks.size() > m) { for (int j = m; j < active_tasks.size(); j++) { active_tasks[j].available_delay--; if (active_tasks[j].available_delay < 0) { printf("NIE"); return 0; } } } for (int j = 0; j < active_tasks.size(); j++) { if (active_tasks[j].work_left == 0) { active_tasks[j] = active_tasks.back(); active_tasks.pop_back(); j--; } } } 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 | #include <cstdio> #include <vector> #include <algorithm> struct task { int available_delay; int work_left; bool operator<(const task& rhs) const { if (available_delay < rhs.available_delay) { return true; } return false; } }; int main() { int n, m; scanf("%d%d", &n, &m); int p, k, c; std::vector<task> active_tasks; std::vector<std::pair<int, task> > all_tasks; int begin = 1000 * 1000; int end = 0; for (int i = 0; i < n; i++) { task currentTask; scanf("%d%d%d", &p, &k, &c); currentTask.available_delay = k - p - c; currentTask.work_left = c; all_tasks.push_back(std::make_pair(p, currentTask)); begin = std::min(begin, p); end = std::max(end, k); } std::sort(all_tasks.begin(), all_tasks.end()); int next_task_position = 0; for (int i = begin; i <= end; i++) { while (next_task_position < all_tasks.size() && all_tasks[next_task_position].first == i) { active_tasks.push_back(all_tasks[next_task_position].second); next_task_position++; } std::sort(active_tasks.begin(), active_tasks.end()); for (int j = 0; j < std::min(m, (int) active_tasks.size()); j++) { active_tasks[j].work_left--; } if (active_tasks.size() > m) { for (int j = m; j < active_tasks.size(); j++) { active_tasks[j].available_delay--; if (active_tasks[j].available_delay < 0) { printf("NIE"); return 0; } } } for (int j = 0; j < active_tasks.size(); j++) { if (active_tasks[j].work_left == 0) { active_tasks[j] = active_tasks.back(); active_tasks.pop_back(); j--; } } } printf("TAK"); return 0; } |