1090 危险品装箱 (25 point(s))

  • 当时用 map 发现有重复的 data 所以改成了 multimap ,但是改成 multimap 之后发现 int int 用数组方式插入的时候产生一个编译错误,百度了一下不晓得为什么,所以换成了用 insert() 和 make_pair() 的方式来插入。

    c++中map插入元素的问题

    C++ map容器和multimap容器

  • 参考了一下别人,还可以用 vector 作为 map 的 val ,这样就可以一个 key 包含多个 val 了。

    而读取的时候,先用一个 vector 向量来保存物品编号,随后 i 遍历 物品遍历并用 map 索引不容物 key ,而 j 下标用来遍历 val 向量的元素。

    while (k--) {
        int cnt, flag = 0, a[100000] = {0};
        scanf("%d", &cnt);
        vector<int> v(cnt);
        for (int i = 0; i < cnt; i++) {
            scanf("%d", &v[i]);
            a[v[i]] = 1;
        }
        for (int i = 0; i < v.size(); i++)
            for (int j = 0; j < m[v[i]].size(); j++)
                if (a[m[v[i]][j]] == 1) flag = 1;
        printf("%s\n",flag ? "No" :"Yes");
    }
    

    而且这里还有一个数组的应用,这个 a 数组虽然开了这么大,但仅仅是拿来记录该物品是否存在的。而不是用来遍历。不过这里换成 map 也可以。

    参考代码

#include <bits/stdc++.h>
using namespace std;

int main() {
	int N, M, K;
	multimap<int, int> pair; 
	cin >> N >> M;
	
	// 读取不容物清单
	while(N--){
		int x, y;
		cin >> x >> y;
		pair.insert(make_pair(x, y));
		pair.insert(make_pair(y, x));
	} 
	
	while(M--){
		bool Yes = true;
		map<int, int> cnt; 
		cin >> K;
		
		// 读取物品清单统计物品个数
		while(K--){
			int good;
			cin >> good;
			cnt[good]++;
		} 
		
		// 遍历不容物清单查找是否存在不容物
		for(auto p: pair)
			if(cnt[p.first] != 0)
				if(cnt[p.second] != 0){
					Yes = false;
					break;
				}
		if(Yes == true) cout << "Yes" << endl;
		else cout << "No" << endl;
	}
}

posted on 2021-09-21 22:17  Atl212  阅读(35)  评论(0)    收藏  举报

导航