AtCoder Beginner Contest 190 C Bowls and Dishes(暴搜)

Bowls and Dishes

题意:

  1. 给你n个dish。有m个条件。
  2. 一个条件要成立,那么它要两个给定的dish中有球。
  3. 现在又k个人。每个人可以选择一个dish然后放球,且每个人有两个选择。
  4. :怎样可以使得 m个条件尽量成立。

思路:

  1. 数据小,可以考虑直接暴搜。
  2. bitmsks 每一位的0(1)代表选第一个dish,还是第二个dish。

AC

#include 
#include 
#define For(i,x,y) for(int i=(x); i<=(y); i++)
#define fori(i,x,y) for(int i=(x); i<(y); i++)
#define rep(i,y,x) for(int i=(y); i>=(x); i--)
#define mst(x,a) memset(x,a,sizeof(x))
#define pb push_back
#define sz(a) (int)a.size()
#define mp make_pair
#define fi first
#define se second
#define debug(a) cout << #a << ": " << a << endl
using namespace std;
typedef long long ll;
typedef pair<int,int>pa;
typedef pair<ll,ll>pai;
const int N = 2e5+10;
const int M = 1e5;
int main()
{
     
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int n, m, k;
    cin>>n>>m;
    vector<int>a(m),b(m);
  //  vector > c(vector(2),2);
    //ctor<>
    int u, v;
    for(int i = 0; i < m; i ++ ){
     
        cin>>a[i]>>b[i];
        a[i]--,b[i]--;
    }
    cin>>k;
    vector<int>c(k),d(k);
    for(int i = 0; i < k ; i ++ ){
     
        cin>>c[i]>>d[i];
        c[i]--,d[i]--;
    }
    int ans = 0;
    for(int bitmasks =0; bitmasks< (1<<k); bitmasks ++ ){
     
        vector<int>vis(n);
        for(int i = 0; i <k;  i ++ ){
     
            if((bitmasks>>i)&1)vis[c[i]] = 1;
            else vis[d[i]] = 1;
        }
        int sum = 0;
        for(int i = 0; i < m ; i ++ ){
     
            if(vis[a[i]]&&vis[b[i]])sum++;
        }
        ans= max(ans,sum);
    }
    cout<<ans<<'\n';
    return 0;
}

你可能感兴趣的:(#,贪心&&暴力)