Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- using namespace std;
- int numberOfRobots, numberOfAbilities, numberOfTasks,
- robots[30], tasks[30], numberOfDependencies;
- vector <int> answer, dependency[30], order;
- bool used[30];
- bool ok(int x, int p)
- {
- for (int mask = 0; mask < (1 << numberOfTasks); mask ++)
- {
- if (__builtin_popcount(mask) != x) continue;
- int currentRobot = 0;
- for (int j = 0; j < 30; j ++)
- {
- if (mask & (1 << j)) currentRobot |= robots[j];
- }
- if ((currentRobot & tasks[p]) == tasks[p])
- {
- answer.clear();
- for (int j = 0; j < 30; j ++)
- {
- if (mask & (1 << j)) answer.push_back(j);
- }
- return true;
- }
- }
- return false;
- }
- void sortByDependency(int x)
- {
- if (used[x]) return;
- used[x] = true;
- for (int i = 0; i < dependency[x].size(); i ++)
- {
- int to = dependency[x][i];
- sortByDependency(to);
- }
- order.push_back(x);
- }
- int main ()
- {
- srand(time(NULL));
- cin >> numberOfRobots >> numberOfAbilities >> numberOfTasks >> numberOfDependencies;
- for (int i = 0, taskA, taskB; i < numberOfDependencies; i ++)
- {
- cin >> taskA >> taskB;
- dependency[taskA].push_back(taskB);
- }
- cout << "ORDER BY DEPENDENCY: \n";
- for (int i = 0; i < numberOfTasks; i ++) sortByDependency(i);
- reverse(order.begin(), order.end());
- for (int i = 0; i < numberOfTasks; i ++) cout << order[i] << " ";
- cout << "\n";
- cout << "ROBOTS: \n";
- for (int i = 0; i < numberOfRobots; i ++)
- {
- cout << i << ": ";
- for (int j = 0; j < numberOfAbilities; j ++)
- {
- int currentRobot = rand() & 1;
- robots[i] |= (currentRobot << j);
- cout << currentRobot << " ";
- }
- cout << "\n";
- }
- cout << "\nTASKS: \n";
- for (int i = 0; i < numberOfTasks; i ++)
- {
- cout << i << ": ";
- for (int j = 0; j < numberOfAbilities; j ++)
- {
- int currentRobot = rand() & 1;
- tasks[i] |= (currentRobot << j);
- cout << currentRobot << " ";
- }
- cout << "\n";
- }
- for (int i = 0; i < numberOfTasks; i ++)
- {
- ans.clear();
- int currentTask = order[i];
- int l = 0, r = numberOfRobots;
- while (l <= r)
- {
- int mid = (l + r) / 2;
- if (ok(mid, currentTask)) r = mid - 1;
- else l = mid + 1;
- }
- cout << order[i] << ": ";
- if (answer.empty())
- {
- cout << "nobody";
- continue;
- }
- for (int j = 0; j < answer.size(); j ++) cout << answer[j] << " ";
- cout << "\n";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement