• [CF1487E] Cheap Dinner


    [CF1487E] Cheap Dinner

    Description

    开胃菜,主菜,饮品和甜点,各一道组成一顿晚饭,第 i 种菜又 ni 道可以选择,其中第 j 道的价格为 aj,bj,cj,dj。有 m1 对开胃菜和主菜不能搭配,有 m2 对主菜和饮品不能搭配,有 m3 对饮品和甜点不能搭配。问总价格最小的晚饭需要多少钱。

    Solution

    对于 B,找到与他搭配的最小的 A

    对于 C,找到与他搭配的最小的 D

    然后在 BC 之间配对即可

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    
    signed main()
    {
        ios::sync_with_stdio(false);
    
        int sa, sb, sc, sd;
        cin >> sa >> sb >> sc >> sd;
    
        vector<int> a(sa), b(sb), c(sc), d(sd);
        vector<int> mba(sb), mcd(sc);
        for (int i = 0; i < sa; i++)
            cin >> a[i];
        for (int i = 0; i < sb; i++)
            cin >> b[i];
        for (int i = 0; i < sc; i++)
            cin >> c[i];
        for (int i = 0; i < sd; i++)
            cin >> d[i];
    
        vector<vector<int>> gba(sb), gbc(sb), gcd(sc);
        int sz;
        cin >> sz;
        while (sz--)
        {
            int x, y;
            cin >> x >> y;
            --x;
            --y;
            gba[y].push_back(x);
        }
        cin >> sz;
        while (sz--)
        {
            int x, y;
            cin >> x >> y;
            --x;
            --y;
            gbc[x].push_back(y);
        }
        cin >> sz;
        while (sz--)
        {
            int x, y;
            cin >> x >> y;
            --x;
            --y;
            gcd[x].push_back(y);
        }
    
        multiset<int> ms;
        for (int aid = 0; aid < sa; aid++)
        {
            ms.insert(a[aid]);
        }
        ms.insert(1e18);
        for (int bid = 0; bid < sb; bid++)
        {
            for (auto t : gba[bid])
                ms.erase(ms.find(a[t]));
            mba[bid] = b[bid] + (*ms.begin());
            for (auto t : gba[bid])
                ms.insert(a[t]);
        }
    
        ms.clear();
        for (int did = 0; did < sd; did++)
        {
            ms.insert(d[did]);
        }
        ms.insert(1e18);
        for (int cid = 0; cid < sc; cid++)
        {
            for (auto t : gcd[cid])
                ms.erase(ms.find(d[t]));
            mcd[cid] = c[cid] + (*ms.begin());
            for (auto t : gcd[cid])
                ms.insert(d[t]);
        }
    
        ms.clear();
        for (int cid = 0; cid < sc; cid++)
        {
            ms.insert(mcd[cid]);
        }
        ms.insert(1e18);
        int ans = 1e18;
        for (int bid = 0; bid < sb; bid++)
        {
            for (auto t : gbc[bid])
                ms.erase(ms.find(mcd[t]));
            ans = min(ans, mba[bid] + (*ms.begin()));
            for (auto t : gbc[bid])
                ms.insert(mcd[t]);
        }
    
        if (ans > 1e10)
        {
            cout << -1;
        }
        else
        {
            cout << ans;
        }
    }
    
  • 相关阅读:
    redis 集群目标、集群查看、配置方法及过程、哨兵配置启动
    redis 事务、Jedis事务处理流程
    redis订阅与发布(把redis作为消息中间件)
    redis 管道技术 pipeline 简介
    redis 适用场景、缓存选择、java实现
    redis 数据淘汰策略与配置
    redis 持久化策略、aof配置、测试、手动持久化、aof文件体积优化
    redis 命令行查看修改配置文件项、配置文件说明
    redis HyperLogLog 基数估算
    redis 命令select、dbsize、清空数据库、info、client
  • 原文地址:https://www.cnblogs.com/mollnn/p/14434289.html
Copyright © 2020-2023  润新知