基础训练——合并电话簿

问题描述

有两本电话簿,现在要合并两个电话簿成为新的电话簿,使新的电话簿无冗余信息。

输入

有两本电话簿进行合并,使合并后仍按姓以字典序升序排列。首先输出合并后的个人数据的总数,接着输出个人信息。如果两本电话簿的个人数据完全一致,贼保留一个。如果两个姓相同,那么先出现的人仍在前。

输入样例

2

Dupont Albert Paris 45247000

Smith John Washington 18554420

3

Brown Gordon London 44863654

Martin Martin Troyes 25452829

Popov Nikolai Moscow 18222931

输出

5

Brown Gordon London 44863654

Dupont Albert Paris 45247000

Martin Martin Troyes 25452829

Popov Nikolai Moscow 18222931

Smith John Washington 18554420

 思路

试了下重新改写set的规则,来保证数据的唯一性,同时插入后就直接保存在set中 自动按设置的规则排序。

代码

#include<cstdio>
#include<iostream>
#include<set>
#include<cstring>
using namespace std;
struct Person{
    char number[1000];//电话号码 
    int qz;//权重 
    bool operator < (const struct Person & pre) const{//重构<符号 
        if(strcmp(this->number,pre.number)==0){//自定义去重 如果一模一样那么就去重 
            return true;
        }
        else{//如果不一样判定姓是不是相同  
            bool isBool = false;
            int len=0;
            for(len=0;len<strlen(this->number);len++){//逐个判断 
                if(this->number[len]!=pre.number[len]){
                    isBool = false;
                    break;
                }
                if(this->number[len]==' '){//空格结束 
                    break;
                }
            }
            if(isBool == true){//如果姓一样那么按输入的权重来排 
                return this->qz < pre.qz;
            }
            else{
                return strcmp(this->number,pre.number)<0;//如果前面的比后面的小 那么返回-1  
            }
        }
    
    }    
};
int main(){
    int n;
    int m;
    Person p; 
    scanf("%d",&n);
    int i=0;
    set<Person> mySet;
    getchar(); 
    for(i=0;i<n;i++){
        gets(p.number);
        p.qz = i;
        mySet.insert(p); 
    }
    scanf("%d",&m); 
    getchar();
    for(i;i<m+n;i++){
        gets(p.number);
        p.qz = i;
        mySet.insert(p);
    }
    cout<<mySet.size()<<endl;
    for(set<Person>::iterator it=mySet.begin();it!=mySet.end();it++){
        cout<<it->number<<endl; 
    }
    
    return 0;
} 

猜你喜欢

转载自www.cnblogs.com/xiaonuolen/p/10597599.html