竞赛
考级
题目大意 给定一堆可能重复的扑克牌花色,求出其中还需要多少不同花色的扑克牌才能凑齐一整套花色完整的扑克牌。 题目难度 acgo 官网评分:普及-; 个人评分:入门 部分分解法(不过这题应该不需要) 404040 分解法: 由题目可得一副完整的扑克牌必须有 525252 种花色,而特殊性质 AAA 满足了输入的牌花色两两不同,直接相减即可 ,非常适合那些只学了一两节C++就混进来的那种人 。 特殊性质 BBB 的解法: 特殊性质 BBB 满足所有牌按照点数从小到大依次输入,所以花色重复的牌会被排到一起,这样的特性适合用来去除重复项并统计。 本来想着应该只有 202020 分的,结果直接得了 707070 分,给我整懵了,但也说明了这题数据水。 正解 (终于能讲正解了) 解法一: 既然很多数据都不会按照顺序输入,那么我们可以在输入数据后对字符串数组进行排序,这样就会变成特殊性质 BBB 的情况了,剩下的就是套用特殊性质 BBB 的代码就行了。 当然,C++ 的 STL 函数模板中还有一个 unique ,可以达到类似效果。 解法二: STL 数据结构中的 set 具有自动去重和排序的功能,对于这题来说可谓是专业对口。 解法三: STL 数据结构中的 map 和 unordered_map 可以利用哈希表的特性去重,也可以达到类似效果。
jcf666
核心思路:写一个密码,把字符转化为数字
.云志.(〃'▽'〃)
这道题考的是桶的去重功能,我这里用二维数组模拟桶。
毛奕程
入门者也能学会的代码~ 思路 1.初始化 在日常生活中,想要处理这种问题,可以使用表格标记,在拥有的那一格上标记1,比如,你有一张CA牌,就可以做出下面的表格: 点数/花色 D C H S A 0 1 0 0 2 0 0 0 0 …… 0 0 0 0 表1表1 表1 看到上面的表格,你自然而然会想到二维数组,于是写下了这行代码: n是牌数,cnt后面再说作用。 2.获取牌数 3.记录出现的牌 每一行输入是两个字符,我们把他们记作flower(花色)和num(点数),这两个变量分别代表“表1”中的行与列。但用数组表示必须把它们转换成合适的下标。在字符中,字符‘1’的ASCII码为49,则转换成下标应该将ASCII码减去49,我们将新的点数下标记作num_t: 可是输入点数还可能是ATJQK五个字符中的一个字符,所以要对这些字符对应的下标进行特殊处理: 之所以将num_t的取值设为0~12而不是1~13是因为数组下标从0开始。 上面的代码还将花色对应的下标记作flower_t。同样的,因为花色都是大写字母,所以对下标作特殊处理(注意下标从0开始): 再将数组中该下标对应的值设为1: 4.记录未出现的牌 在数组中,未出现的牌被标记为0,也就是说,遍历这个数组,如果当前值为0说明这张牌未出现。我们可以使用初始化时声明的cnt来记录未出现牌的数量: 5.输出结果 直接输出cnt的值: 完整代码 别以为在运算符前后加空格的就是AI,变量名都是自己写的,我要是AI干脆直接用set得了。 本文纯手写,并非使用大模型生成!
cchu
这里用的是双层循环去重
skirmish
我的方法比较麻烦,if大法,把字母牌(例如A,T,)通过if,再通过一个bool类型的vis数组进行标记,标记是否出现,再在最后通过vis数组进行输出完成 以下是我的代码:
Feanaze
#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
因为输入只有两个字母且数据量不大,所以这里可以使用二维标记数组去重 主要思路:在输入时判断是否已经出现过,未出现过就标记然后统计数量 代码如下: 感谢您的浏览
c++菜鸟
༺ཌༀ`§☯末影之路☯§′ༀད༻
用桶,很简单:
手握风云
循环直接查找哈
宇智波带土(漂泊)
#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; }
AX焊F70(诗人)
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll n; string s; set<string> se; int main(){ cin>>n; for(ll i=1;i<=n;i++){ cin>>s; se.insert(s); } cout<<52-se.size(); return 0; }
张轩齐
我这用的是map,下标设置成string类型直接访问扑克牌数量,再检查是否重复(去重)。 代码
你
JMZ詹总
提交答案之后,这里将显示提交结果~