同名检查

解题思路:

  1. 问题分析

    • 题目要求判断N个人中是否存在完全相同的姓名组合(姓氏+名字)

    • 需要检测是否有至少两个人的姓氏和名字都完全相同

  2. 核心算法

    • 使用map数据结构来统计每个"姓氏+名字"组合出现的次数

    • map的特性是key唯一,重复插入相同的key不会增加元素数量,只会增加对应的value

    • 通过比较map.size()和总人数n来判断是否有重复

  3. 关键点

    • 将"姓氏+空格+名字"拼接成字符串作为map的key

    • 如果map的大小小于总人数n,说明至少有一个姓名组合出现了多次

    • 这种方法避免了暴力双重循环,时间复杂度为O(nlogn)

  4. 优化说明

    • 相比双重循环的O(n²)解法,这种解法更高效

    • 利用了map自动去重的特性

    • 不需要显式统计每个key的出现次数,只需判断是否有重复

  5. 边界情况处理

    • 当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;
}

 

posted @ 2025-04-29 19:44  行胜于言Ibl  阅读(33)  评论(0)    收藏  举报