​PAT 1149​​​ ​​C++​​版

1.题意

有些商品是不能一起存放的,比如说氧化剂和易燃液体。现在给出不能共存的商品对。然后再给出一串商品名单,问给出的这些商品名单是否可以一起存放?

2.分析

  • 想到商品对的时候,可能第一反应是使用map,但是本题使用map并不可以【笔者认为不可以,如果大佬有使用map,还请不吝赐教】。因为同一个物体可能有多个不能兼容的物体。所以使用map不大合适。然后我想到的就是使用一个vector,建一个动态的二维数组。下标代表的是某物品,其值存储的是不能与其共存的商品id。然后将待查询的商品名单放到一个set中。其中然后遍历其中的每一个元素的不兼容物体是否也存在set中。如果存在,则输出No,否则输出Yes。

3.代码

#include<cstdio>
#include<set>
#include<vector>
#include<cmath>
#include<iostream>
#define maxn 100005

using namespace std;

vector<int> imp[maxn];

int main(){
int i,j,k;
int N,M;//N是不兼容的货物对; M是待放的商品
cin >> N >> M;

int a,b;//代表不兼容的两个货物
for(i = 0;i< N ;i++){
cin >> a >> b; //输入a,b两个数
//cout << min(a,b);
imp[min(a,b)].push_back(max(a,b));
}

set<int> goods;
int goodNum;
for(i = 0;i< M;i++){
cin >> goodNum;
goods.clear();
for(j = 0;j< goodNum;j++){
cin >> a;
goods.insert(a);
}

//开始判断这些商品是否能够放在一起
int curGoods;
int flag = 0;
for(set<int>::iterator it=goods.begin();it!=goods.end();it++){
curGoods = *it;//表示的当前的商品
for(k = 0;k < imp[curGoods].size();k++){
if(goods.find( imp[curGoods][k] ) != goods.end()) {//如果找到了,说明有冲突
cout <<"No" << "\n";
flag = 1;
break;
}
}
if(flag == 1) break;
}
if(flag == 0) cout << "Yes" << "\n";

}
}

4.测试用例

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

5.执行结果

一遍AC。