forked from wisdompeak/LeetCode
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path2151.Maximum-Good-People-Based-on-Statements.cpp
65 lines (59 loc) · 1.59 KB
/
2151.Maximum-Good-People-Based-on-Statements.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
class Solution {
public:
bool checkOK(int state, vector<vector<int>>& statements)
{
int n = statements.size();
vector<int>judge(n, -1);
int flag = 1;
for (int i=0; i<n; i++)
{
int t = ((state>>i)&1);
if (t==0) continue;
for (int j=0; j<n; j++)
{
if (statements[i][j]==2) continue;
if (judge[j]==-1)
judge[j] = statements[i][j];
else if (judge[j]!=statements[i][j])
{
flag = 0;
break;
}
}
if (flag==0)
break;
}
for (int i=0; i<n; i++)
{
int t = ((state>>i)&1);
if (t==1 && judge[i]==0)
{
flag = 0;
break;
}
if (t==0 && judge[i]==1)
{
flag = 0;
break;
}
}
return flag;
}
int maximumGood(vector<vector<int>>& statements)
{
int m = statements.size();
for (int k=m; k>=1; k--)
{
int state = (1 << k) - 1;
while (state < (1 << m))
{
if (checkOK(state, statements))
return k;
int c = state & - state;
int r = state + c;
state = (((r ^ state) >> 2) / c) | r;
}
}
return 0;
}
};