同名检查
解题思路:
- 
问题分析: - 
题目要求判断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号
浙公网安备 33010602011771号