前情提要:虽然洛谷讨论区里大多数都是倾向用哈希解决该题,但实际上可以用一些邪门小技巧来A这道题awa
先来读题。
题目中说小 P 想知道他至少得向小 S 借多少张牌,才能让从小 S 和小 Q 借来的牌中,可以选出52张牌构成一副完整的扑克牌。
题目说了是求至少要借多少牌,而扑克牌总共只有 \(52\) 种,这意味着我们当下若有 \(x\) 种牌,那么只需要再借 \(52-x\) 张牌即可。
面对可能出现的花色重复的扑克牌,我们可以使用set
容器的特性去重。
考虑时间复杂度,set
的复杂度是 \(O(log\ n)\) ,而输入时的循环则是 \(O(n)\),在该题中 \(n≤52\) ,时间限制则为 \(1000\ ms\),所以思路可行。
实现代码如下:
#include<bits/stdc++.h>//伟大的万能头
using namespace std;
set<string>st;//去重用的set容器
int main(){
//By Chengliye
int n;
cin>>n;
while(n--){
string str;
cin>>str;//输入花色
st.insert(str);//将花色添加至st中,若已存在该花色则不添加
}
cout<<52-st.size();//st.size()代表已经借到的卡牌种类数量
return 0;
}
若有错漏,欢迎指出。
标签:poker,set,题解,张牌,52,花色,str,T1,CSP From: https://www.cnblogs.com/chengliye/p/18515695/CSP-J2024T1