Codeforces Round #568 (Div. 2) F - Two Pizzas (状态压缩,暴力)

💉 💉 💉

题意:每个顾客有几种想要的原料,每个披萨含有几种原料,问你买两块披萨,让最多的顾客全部吃到想要的原料,同时花最少的钱,需要买哪两块

原料只有九种,O(n^2)枚举披萨转换为(512*512)枚举状态,买两个状态一样的跑一遍,买两个状态不一样的跑一遍

是被队友嫌弃的码风

signed main()
{
    int n, m; cin >> n >> m;
    vector<int> many(512, 0); //某格式可以让多少顾客开心
    rep(i, n)                 //顾客
    {
        int k, sum = 0;  cin >> k;
        rep(j, k)
        {
            int x;  cin >> x;
            sum |= (1 << (x - 1));
        }
        rep(j, 512) if ((j & sum) == sum)++ many[j];
    }
    vector<pii> pizza[512]; //每个格式的披萨价钱
    rep(i, m)               //披萨
    {
        int k, c, sum = 0;   cin >> c >> k;
        rep(j, k)
        {
            int x;   cin >> x;
            sum |= (1 << (x - 1));
        }
        pizza[sum].push_back(make_pair(c, i + 1));
    }
    int maxhappy = 0, mincost = 1 << 30, a = 1, b = 2;
    //买两个一模一样的披萨
    for (int i = 0; i < 512; ++i)
    {
        sort(all(pizza[i]));
        if (pizza[i].size() >= 2 && (many[i] > maxhappy || (many[i] == maxhappy && pizza[i][0].first + pizza[i][1].first < mincost)))
            maxhappy = many[i], mincost = pizza[i][0].first + pizza[i][1].first, a = pizza[i][0].second, b = pizza[i][1].second;
    }
    //买两个不一样的披萨
    for (int i = 0; i < 512; ++i)
        for (int j = i + 1; j < 512; ++j)
            if (pizza[i].size() && pizza[j].size() && (many[i | j] > maxhappy || (many[i | j] == maxhappy && pizza[i][0].first + pizza[j][0].first < mincost)))
                maxhappy = many[i | j], mincost = pizza[i][0].first + pizza[j][0].first, a = pizza[i][0].second, b = pizza[j][0].second;
    cout << a << " " << b << endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值