题目链接:
截图:
大意:
一共有n个盘子,m个条件,每个条件包含两个数(代表盘子编号),如果这两个盘子里面都有球的话,即为这个条件得到满足,之后又给出了k个要求,每个要求也包含两个数,但是这两个数里面有且仅有一个数可以满足(也就是这两个盘子里面你可以选一个来放球),问你通过如何挑选盘子来放球,使得能满足的条件数最多
思路:
题目中给出k的范围小于16,意味着我们可以暴力枚举出所有情况,然后判断出每种情况所满足的条件个数,取最大值就可以了,需要枚举的种类很多,数组很可能开不下,因此采用状压的思想列举所有可能出来,因为盘子的数量很少,我们可以用桶排的思想标识出哪些盘子是被我们选出来的,这样问题就解决了
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 105;
int a[N], b[N], c[N], d[N], e[N];
int main() {
ll ret = 0;
int n, m;
cin >> n >> m;
for(int i = 0 ; i < m; i++) cin >> a[i] >> b[i];
int k;
cin >> k;
for(int i = 0 ; i < k; i++) cin >> c[i] >> d[i];
for(int di = 0; di < (1 << k); di++) {
ll cur = 0;
fill(e, e + N, 0);
for(int j = 0; j < k; j++)
if((1 << j) & di) e[d[j]]++;
else e[c[j]]++;
for(int i = 0; i < m; i++)
if(e[a[i]] && e[b[i]])
cur++;
ret = max(ret, cur);
}
cout << ret;
}