PAT 1149 C++ 版

版权声明:如若转载,请联系作者。 https://blog.csdn.net/liu16659/article/details/86768960

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。

猜你喜欢

转载自blog.csdn.net/liu16659/article/details/86768960