1601. 最多可达成的换楼请求数目
二进制枚举、模拟
class Solution {
public:
vector<vector<int>> re;
int ans = 0, m;
int sum[21];
int lowbit(int i) {
return i & (-i);
}
int get(int u) {
int res = 0;
while (u) {
u -= lowbit(u);
res ++ ;
}
return res;
}
bool check(int u) {
memset(sum, 0, sizeof sum);
int res = 0;
for (int i = 0; i < m; i ++ )
if (u >> i & 1) {
int a = re[i][0], b = re[i][1];
if (++sum[a] == 1) res ++ ;
if (--sum[b] == 0) res -- ;
}
return res == 0;
}
int maximumRequests(int n, vector<vector<int>>& requests) {
re = requests;
m = re.size();
for (int i = 0; i < 1 << m; i ++ ) {
int cnt = get(i);
if (cnt < ans) continue;
if (check(i)) ans = cnt;
}
return ans;
}
};