forked from TARANG0503/DSA-Practice
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsmallest_sufficient_team.cpp
79 lines (74 loc) · 2.18 KB
/
smallest_sufficient_team.cpp
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
#include <bits/stdc++.h>
using namespace std;
void smallestSufficientTeam(vector<string>& req_skills, vector<vector<string>>& people) {
unordered_map<string, int> mapping;
int target = 0;
for(int i=0; i<req_skills.size(); i++){
// target = (target<<1)|1;
target += pow(2,i);
mapping[req_skills[i]] = i;
}
cout<<target<<endl;
int n = people.size();
vector<int> skill_people(n,0);
int temp;
for(int i=0; i<n; i++){
temp = 0;
for(int j=0; j<people[i].size(); j++){
temp += pow(2, mapping[people[i][j]]);
}
skill_people[i] = temp;
}
for(auto itr : skill_people) cout<<itr<<" ";
cout<<endl;
// return skill_people;
cout<<(skill_people[1] | skill_people[2] | skill_people[3])<<endl;
int ans;
vector<vector<int>> dp(n, vector<int>(n,0));
for(int k=0; k<n; k++){
for(int i=0; i<n-k; i++){
int j = i+k;
if(i == j) dp[i][j] = skill_people[i];
else{
int result = (dp[i+1][j] | dp[i][j-1]);
dp[i][j] = result;
if(result == target){
cout<<i<<"-----"<<j<<endl;
i = n;
k = n;
}
}
}
}
cout<<endl;
for(auto itr1 : dp){
for(auto itr2 : itr1){
cout<<itr2<<" ";
}
cout<<endl;
}
}
int main()
{
int test; cin>>test;
while(test--){
int n; cin>>n;
vector<string> req_skills(n);
for(int i=0; i<n; i++){
cin>>req_skills[i];
}
int m; cin>>m;
vector<vector<string>> people;
for(int i=0; i<m; i++){
int p; cin>>p;
vector<string> temp(p);
for(int j=0; j<p; j++){
cin>>temp[j];
}
people.push_back(temp);
temp.clear();
}
smallestSufficientTeam(req_skills, people);
}
return 0;
}