11-散列1 电话聊天狂人 (25 分)

给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人。

输入格式:

输入首先给出正整数N(≤),为通话记录条数。随后N行,每行给出一条通话记录。简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔。

输出格式:

在一行中给出聊天狂人的手机号码及其通话次数,其间以空格分隔。如果这样的人不唯一,则输出狂人中最小的号码及其通话次数,并且附加给出并列狂人的人数。

输入样例:

4
13005711862 13588625832
13505711862 13088625832
13588625832 18087925832
15005713862 13588625832

输出样例:

13588625832 3
//2,3测试点未过
#include<iostream>
#include<map>
using namespace std;
const int maxn = 1000100;

int main(){
    int n;
    //scanf("%d",&n);
    cin >> n;
    map<string,int> mp; 
    string s1,s2;
    for(int i = 0; i < n; i++){
        cin >> s1 >> s2;
        ++mp[s1];
        ++mp[s2];
    }
    int cnt = 0;//通话最多次人数
     int time = -1;//通话最多次的时间
     string s;//通话最多次最小标号 
    map<string,int>::iterator it;
    
    
    for(it = mp.begin(); it != mp.end(); it++){
        if(it->second > time){
            cnt = 1;
            time = it->second;
            s = it->first;
        }else if(it->second == time){
              cnt++;
              if(s < it->first) s= it->first;
        }
    }
    cout << s << " " << time;
    if(cnt > 1) cout << " " << cnt << endl;
    return 0;
}

https://blog.csdn.net/xijujie/article/details/53224218

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 12
 
typedef struct ListNode *Position;
typedef struct HTable *HashTable;
struct ListNode {
    char data[N];
    int count;
    Position next;
};
struct HTable {
    Position list;
    int size;
};
HashTable CreatTable(int n);
void Insert(HashTable H, char *key);
void Solve(HashTable H);
int NextPrime(int n);
 
int main() {
    int i, n;
    char key[N];
    HashTable H;
    scanf("%d", &n);
    H = CreatTable(n * 2);
    for (i = 0; i < 2 * n; i++) {
        scanf("%s", key);
        Insert(H, key);
    }
    Solve(H);
    return 0;
}
 
HashTable CreatTable(int n) {
    HashTable H;
    int i;
    H = (HashTable)malloc(sizeof(struct HTable));
    H->size = NextPrime(n);
    H->list = (Position)malloc(H->size*sizeof(struct ListNode));
    for (i = 0; i < H->size; i++) 
        H->list[i].next = NULL;    
    return H;
}
 
void Insert(HashTable H, char *key) {
    Position p, temp;
    int h;
    h = (atoi(key + 6)) % H->size;
    p = H->list[h].next;
    while (p && strcmp(p->data, key)) {
        p = p->next;
    }
    if (p) p->count++;
    else {
        temp = (Position)malloc(sizeof(struct ListNode));
        strcpy(temp->data, key);
        temp->count = 1;
        temp->next = H->list[h].next;
        H->list[h].next = temp;
    }
}
 
 
void Solve(HashTable H) {
    int i, max = 0, num;
    char min[N];
    Position p;
    for (i = 0; i < H->size; i++) {
        p = H->list[i].next;
        while (p) {
            if (p->count > max) {
                max = p->count;
                strcpy(min, p->data);
                num = 1;
            }
            else if (p->count == max) {
                num++;
                if (strcmp(p->data, min) < 0)
                    strcpy(min, p->data);
            }
            p = p->next;
        }
    }
 
    if(num == 1)
        printf("%s %d\n", min, max);
    else
        printf("%s %d %d\n", min, max, num);
    
}
 
int NextPrime(int n) {
    int i, j;
    n = (n % 2) ? n + 2 : n + 1;
    for (i = n;; i += 2) {
        for (j = 3; j*j <= i && i%j; j++);
        if (j*j > i) break;
    }
    return i;
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
 
#define MAXS 11
#define MAXD 5
 
typedef struct HashEntry *List;
struct HashEntry{
    char PhoneNo[MAXS+1];
    int Cnt;
    List Next;
};
 
struct HashTb1{
    int TableSize;
    List TheLists;
};
typedef struct HashTb1 *HashTable;
 
int NextPrime(int N){
    int i;
    if(!(N%2))N++;
    for(;;N+=2){
        for(i=(int)sqrt(N);i>2;i--){
            if(!(N%i))break;
        }
        if(i==2)break;
    }
    return N;
}
 
HashTable InitializeTable(int N){
    int i;
    HashTable H=(HashTable)malloc(sizeof(struct HashTb1));
    H->TableSize=NextPrime(N);
    H->TheLists=(List)malloc(sizeof(struct HashEntry)*H->TableSize);
    for(i=0;i<H->TableSize;i++){
        H->TheLists[i].Cnt=0;
        H->TheLists[i].Next=NULL;
        H->TheLists[i].PhoneNo[0]='\0';
    }
    return H;
}
 
int Hash(int Key,int P){
    return Key%P;
}
 
void InsertAndCount(char *Key,HashTable H){
    List Ptr,NewCell,L;
    L=&(H->TheLists[Hash(atoi(Key+6),H->TableSize)]);
    Ptr=L->Next;
    while(Ptr&&strcmp(Ptr->PhoneNo,Key)){
        Ptr=Ptr->Next;
    }
    if(Ptr){
        Ptr->Cnt++;    
    }
    else{
        NewCell=(List)malloc(sizeof(struct HashEntry));
        strcpy(NewCell->PhoneNo,Key);
        NewCell->Cnt=1;
        NewCell->Next=L->Next;
        L->Next=NewCell; 
    }
}
 
void Output(HashTable H){
    int i,MaxCnt,PCnt;
    List Ptr;
    char MinPhone[MAXS+1];
    MaxCnt=PCnt=0;
    MinPhone[0]='\0';
    for(i=0;i<H->TableSize;i++){
        Ptr=H->TheLists[i].Next;
        while(Ptr){
            if(Ptr->Cnt>MaxCnt){
                MaxCnt=Ptr->Cnt;
                strcpy(MinPhone,Ptr->PhoneNo);
                PCnt=1;
            }
            else if(Ptr->Cnt==MaxCnt){
                PCnt++;
                if(strcmp(MinPhone,Ptr->PhoneNo)>0){
                    strcpy(MinPhone,Ptr->PhoneNo);
                }
            }
            Ptr=Ptr->Next;
        }
    }
    printf("%s %d",MinPhone,MaxCnt);
    if(PCnt>1){
        printf(" %d",PCnt);
    }
//    printf("\n");
}
int main(){
    int N,i;
    char Key[MAXS+1];
    HashTable H;
    scanf("%d",&N);
    H=InitializeTable(N);
    for(i=0;i<N;i++){
        scanf("%s",Key);
        InsertAndCount(Key,H);
        scanf("%s",Key);
        InsertAndCount(Key,H);
    }
    Output(H);    
} 

这道题留着等九月份再看把

转载于:https://www.cnblogs.com/wanghao-boke/p/10946252.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学生参加学科竞赛有着诸多好处,不仅有助于个人综合素质的提升,还能为未来职业发展奠定良好基础。以下是一些析: 首先,学科竞赛是提高专业知识和技能水平的有效途径。通过参与竞赛,学生不仅能够深入学习相关专业知识,还能够接触到最新的科研成果和技术发展趋势。这有助于拓展学生的学科视野,使其对专业领域有更深刻的理解。在竞赛过程中,学生通常需要解决实际问题,这锻炼了他们独立思考和解决问题的能力。 其次,学科竞赛培养了学生的团队合作精神。许多竞赛项目需要团队协作来完成,这促使学生学会有效地与他人合作、协调工。在团队合作中,学生们能够学到如何有效沟通、共同制定目标和工合作,这对于日后进入职场具有重要意义。 此外,学科竞赛是提高学生综合能力的一种途径。竞赛项目通常会涉及到理论知识、实际操作和创新思维等多个方面,要求参赛者具备全面的素质。在竞赛过程中,学生不仅需要展现自己的专业知识,还需要具备创新意识和解决问题的能力。这种全面的综合能力培养对于未来从事各类职业都具有积极作用。 此外,学科竞赛可以为学生提供展示自我、树立信心的机会。通过比赛的舞台,学生有机会展现自己在专业领域的优势,得到他人的认可和赞誉。这对于培养学生的自信心和自我价值感非常重要,有助于他们更加积极主动地投入学习和未来的职业生涯。 最后,学科竞赛对于个人职业发展具有积极的助推作用。在竞赛中脱颖而出的学生通常能够引起企业、研究机构等用人单位的关注。获得竞赛奖项不仅可以作为个人履历的亮点,还可以为进入理想的工作岗位提供有力的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值