前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >1090 危险品装箱 (25 分)

1090 危险品装箱 (25 分)

作者头像
可爱见见
发布2019-11-18 23:06:14
9680
发布2019-11-18 23:06:14
举报
文章被收录于专栏:卡尼慕卡尼慕

1090 危险品装箱 (25 分)

集装箱运输货物时,我们必须特别小心,不能把不相容的货物装在一只箱子里。比如氧化剂绝对不能跟易燃液体同箱,否则很容易造成爆炸。

本题给定一张不相容物品的清单,需要你检查每一张集装箱货品清单,判断它们是否能装在同一只箱子里。

输入格式:

输入第一行给出两个正整数:N (≤104) 是成对的不相容物品的对数;M (≤100) 是集装箱货品清单的单数。

随后数据分两大块给出。第一块有 N 行,每行给出一对不相容的物品。第二块有 M 行,每行给出一箱货物的清单,格式如下:

代码语言:javascript
复制
K G[1] G[2] ... G[K]

其中 K (≤1000) 是物品件数,G[i] 是物品的编号。简单起见,每件物品用一个 5 位数的编号代表。两个数字之间用空格分隔。

输出格式:

对每箱货物清单,判断是否可以安全运输。如果没有不相容物品,则在一行中输出 Yes,否则输出 No

输入样例:

代码语言:javascript
复制
6 3
20001 20002
20003 20004
20005 20006
20003 20001
20005 20004
20004 20006
4 00001 20004 00002 20003
5 98823 20002 20003 20006 10010
3 12345 67890 23333

输出样例:

代码语言:javascript
复制
No
Yes
Yes

【我的代码】

代码语言:javascript
复制
 1//1090 危险品装箱 (25 分)
 2#include <iostream>
 3#include <map>
 4#include <vector>
 5using namespace std;
 6int main(){
 7    int N, M;
 8    cin>>N>>M;
 9    map<int, vector<int> > m;
10    int tmp1, tmp2, tmp3;
11    for(int i = 0; i < N; i++){
12        cin>>tmp1>>tmp2;
13        m[tmp1].push_back(tmp2);   //说明两者不相容 
14        m[tmp2].push_back(tmp1);
15    }
16    for(int i = 0; i < M; i++){
17        bool flag = false;
18        int c[100005] = {0};
19        cin>>tmp3;
20        int b[tmp3];
21        for(int j = 0; j < tmp3; j++){
22            cin>>b[j];
23            c[b[j]]++;
24        }
25        for(int k = 0; k < tmp3; k++){
26            for(int j = 0; j < m[b[k]].size() ;j++){
27                if(c[m[b[k]][j]]) flag = true;
28            }
29        }
30        if(!flag){
31            cout<<"Yes"<<endl;
32        }
33        else{
34            cout<<"No"<<endl;
35        }
36    } 
37    return 0;
38} 

【思路】

思路还是比较巧妙的,还是老套路,巧妙地使用索引。这里有一个小陷阱就是索引很大的情况下,开数组会比较麻烦,这里还是开vector比较好

我是怎么进入陷阱的。很简单,需要一个映射嘛,我就想着用一个二维数组来记录不能共存的货物,结果直接爆了。。脑子一下转不过来,网上一看柳神的代码,逻辑全都一样,就是巧妙地使用了map加上vector,从而避免了过大的内存开销。

具体说下。这程序需要注意两块内容:

  1. 如何记录不能共存的货物。
  2. 如何查看是否出现了不能共存的货物共存的情况。

那么我们先来看看第一点。记录不能共存的货物。注意,这里的货物们可能会与多个货物不能共存,也就是简单的二维映射是不能满足的,因此这里使用了map嵌套一个vector实现。key值:某货物,value:某货物的互斥货物们。

保存完以后,如何遍历一个一维数组从而发现是否存在不能共存的货物。这里可以使用一个c数组记录每个货物的出现情况。

代码语言:javascript
复制
if(c[m[b[k]][j]]) flag = true;

j用来遍历对应key的vector值。

解决完这两个问题剩下的就只剩下简单的输入输出了,这里不细说了。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 卡尼慕 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 输入格式:
  • 输出格式:
  • 输入样例:
  • 输出样例:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档