题目链接
动物之森-小红书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;
}