题目链接
 动物之森-小红书2024笔试(codefun2000)
题目内容
塔子哥最近在玩一款叫做“动物之森”的四字开放游戏世界。由于塔子哥氪金了,所以他在游戏中拥有很多个宝箱,每个宝箱里都装着一些他收集的宝石。每一种类型的宝石都有不同的作用。
有一天,塔子哥在游戏中遇到了另一位玩家古德拜。古德拜告诉塔子哥,如果他的宝箱满足以下3个条件,那么他就能获得一个成就奖励。塔子哥非常好奇,于是他决定尝试一下。
古德拜告诉了塔子哥以下3个条件:
1、每个宝箱里不会有两颗相同的宝石。
2、每一种类型的宝石,只出现在一个宝箱中或者出现在所有宝箱中。
3、每个宝箱长度一样
塔子哥是一位收藏玩家,所以他很想要这个成就奖励。
现在问题来了:塔子哥的这些宝箱是否同时满足上述3个条件呢?他能否获得成就奖励呢?
输入描述
输出描述
对于每组测试数据,如果小明的这些袋子满足全部三个条件,则在一行中先输出 Yes ,然后按编号从小到大输出所有宝箱中都有的宝石类型。
假如没有任何一种类型的宝石为所有宝箱共有,则仅需要输出 Yes 。
如果塔子哥的这些宝箱不满足以上的所有条件,则输出 NO。
样例1
输入
3
1
3 50 40 30
3
2 49 50
3 58 49 50
1 49
5
3 90 89 63
2 89 63
2 63 89
3 89 32 63
3 86 63 89
输出
Yes 30 40 50
NO
NO
提示
哈希表+模拟
题解1
#include<bits/stdc++.h>
using namespace std;
int T, n, t[110], a[110], res[110]; // res[i]保存所有宝箱中都有的宝石类型
int main(){
	scanf("%d", &T);
	while(T--){
		scanf("%d", &n);
		bool flag = true;
		map<int,int> hmap; // 由于需要按编号从小到大输出所有宝箱中都有的宝石类型,因此要保证key的递增性 
		int cnt = 0;
		for(int i = 1; i <= n; i++){
			scanf("%d", &t[i]);
			if(i > 1 && t[i] != t[i - 1]) flag = false; // 宝箱长度不一样 
			set<int> st;
			for(int j = 1; j <= t[i]; j++){
				scanf("%d", &a[i]);
				if(hmap.count(a[i]) ==0) hmap[a[i]] = 1;
				else hmap[a[i]]++; 
				st.insert(a[i]);
			}
			if(int(st.size()) < t[i]) flag = false; // 一个宝箱里面至少有两颗相同的宝石 
		}
		if(!flag) {
			printf("NO\n");
			continue;
		}
		for(auto& it : hmap){
			if(it.second != 1 && it.second != n){ // 不满足每一种类型的宝石,只出现在一个宝箱中或者出现在所有宝箱中 
				flag = false;
				break;
			} else if(it.second == n) res[++cnt] = it.first; // 某类宝石出现在所有宝箱中 
		}
		if(flag){
			printf("Yes");
			if(cnt) {
				for(int i = 1; i <= cnt; i++) {
					printf(" ");
					printf("%d", res[i]);
				}
			}
			printf("\n");
		}else {
			printf("NO\n");
		}
	}
	return 0;
}




















