CSP-J 2024 T1

· · 题解

我们注意到输入的牌字符串肯定是合法的,那么这题就变成了一个去重问题。

两种方法:

  1. std::unique

std::unique 可以对一个有序的序列去重,并且将重复的放在末尾,具体的, unique 会返回去重后这个序列的末指针。

那么我们将所有牌用 sort 排序后用一遍 unique 即可。

#include<bits/stdc++.h>
using namespace std;

const int N=100;
int n;
string s[N];

signed main(){
    ios::sync_with_stdio(0);cin.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++) cin>>s[i];
    sort(s+1,s+n+1);
    n=unique(s+1,s+n+1)-s-1;
    cout<<52-n;
    return 0;
}
  1. std::map

我们可以用内置平衡树的 map 来实现,不会的可以百度。

我们就可以用 map<string,bool> mp 来将一个字符串映射成一个 bool 型,而在代码的最后调用 mp.size() 即可返回有多少张本质不同的卡牌。

#include<bits/stdc++.h>
using namespace std;

const int N=100;
int n;
string s[N];
map<string,bool> mp;

signed main(){
    ios::sync_with_stdio(0);cin.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>s[i];
        mp[s[i]]=1;
    }
    cout<<52-mp.size();
    return 0;
}
  1. 暴力
那么我们直接暴力在数组中寻找即可。 ```cpp #include<bits/stdc++.h> using namespace std; const int N=100; int n,cnt; string s[N]; map<string,bool> mp; signed main(){ ios::sync_with_stdio(0);cin.tie(0); cin>>n; for(int i=1;i<=n;i++){ cin>>s[i]; bool fg=1; for(int j=1;j<i;j++){ if(s[i]==s[j]){ fg=0; break; } } cnt+=fg; } cout<<52-cnt; return 0; } ```