同名检查
解题思路:
-
问题分析:
-
题目要求判断N个人中是否存在完全相同的姓名组合(姓氏+名字)
-
需要检测是否有至少两个人的姓氏和名字都完全相同
-
-
核心算法:
-
使用
map数据结构来统计每个"姓氏+名字"组合出现的次数 -
map的特性是key唯一,重复插入相同的key不会增加元素数量,只会增加对应的value -
通过比较
map.size()和总人数n来判断是否有重复
-
-
关键点:
-
将"姓氏+空格+名字"拼接成字符串作为map的key
-
如果map的大小小于总人数n,说明至少有一个姓名组合出现了多次
-
这种方法避免了暴力双重循环,时间复杂度为O(nlogn)
-
-
优化说明:
-
相比双重循环的O(n²)解法,这种解法更高效
-
利用了map自动去重的特性
-
不需要显式统计每个key的出现次数,只需判断是否有重复
-
-
边界情况处理:
-
当n=2时也能正确判断
-
处理最大n=1000时效率依然很高
-
自动处理了所有可能的字符串组合
-
#include<bits/stdc++.h>
using namespace std;
// 使用map统计每个"姓氏+名字"出现的次数
map<string, int> mp;
int n; // 人数
int main() {
// 读取人数n
cin >> n;
// 循环读取每个人的姓氏和名字
for (int i = 1; i <= n; i++) {
string a, b;
cin >> a >> b;
// 将"姓氏+空格+名字"作为key存入map,并计数
mp[a+" "+b]++;
}
// 判断是否有重复姓名:
// 如果map的大小小于n,说明有重复的key(即同名的人)
if (mp.size() < n)
cout << "Yes"; // 存在同名
else
cout << "No"; // 没有同名
return 0;
}

浙公网安备 33010602011771号