1090 危险品装箱 (25 point(s))
-
当时用 map 发现有重复的 data 所以改成了 multimap ,但是改成 multimap 之后发现 int int 用数组方式插入的时候产生一个编译错误,百度了一下不晓得为什么,所以换成了用 insert() 和 make_pair() 的方式来插入。
-
参考了一下别人,还可以用 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;
}
}
浙公网安备 33010602011771号