竞赛
考级
题目大意 给定一堆可能重复的扑克牌花色,求出其中还需要多少不同花色的扑克牌才能凑齐一整套花色完整的扑克牌。 题目难度 acgo 官网评分:普及-; 个人评分:入门 部分分解法(不过这题应该不需要) 404040 分解法: 由题目可得一副完整的扑克牌必须有 525252 种花色,而特殊性质 AAA 满足了输入的牌花色两两不同,直接相减即可 ,非常适合那些只学了一两节C++就混进来的那种人 。 特殊性质 BBB 的解法: 特殊性质 BBB 满足所有牌按照点数从小到大依次输入,所以花色重复的牌会被排到一起,这样的特性适合用来去除重复项并统计。 本来想着应该只有 202020 分的,结果直接得了 707070 分,给我整懵了,但也说明了这题数据水。 正解 (终于能讲正解了) 解法一: 既然很多数据都不会按照顺序输入,那么我们可以在输入数据后对字符串数组进行排序,这样就会变成特殊性质 BBB 的情况了,剩下的就是套用特殊性质 BBB 的代码就行了。 当然,C++ 的 STL 函数模板中还有一个 unique ,可以达到类似效果。 解法二: STL 数据结构中的 set 具有自动去重和排序的功能,对于这题来说可谓是专业对口。 解法三: STL 数据结构中的 map 和 unordered_map 可以利用哈希表的特性去重,也可以达到类似效果。
jcf666
这道题考的是桶的去重功能,我这里用二维数组模拟桶。
毛奕程
这里用的是双层循环去重
skirmish
#include<bits/stdc++.h> using namespace std; int main(){ int n,cnt; cin>>n; cnt=52-n; string abc[n+10]; for(int i=1;i<=n;i++){ cin>>abc[i]; for(int j=1;j<i;j++){ if(abc[i]==abc[j]){cnt++;break;} } } cout<<cnt; return 0; }
wwh
#include<bits/stdc++.h> #include<set> using namespace std; int main(){ set<string> st; int n; cin >> n; for(int i = 1;i <= n;i++){ string s; cin >> s; st.insert(s); } cout << 52 - st.size(); return 0; }
T7热成像大人
用桶,很简单:
手握风云
因为输入只有两个字母且数据量不大,所以这里可以使用二维标记数组去重 主要思路:在输入时判断是否已经出现过,未出现过就标记然后统计数量 代码如下: 感谢您的浏览
c++菜鸟