zoukankan      html  css  js  c++  java
  • 华为笔试题目“最后几人知”

    在通讯软件中,在群里面转发消息可以使得一条消息扩散到最多那里。假设已知有m个群,其中一个人把一条消息发到他所在的群里面,这些群里面的每个人又把消息再次转发到他所有的群里面,请问所有群的所有人都转发过一次后,最后几个人收到该消息(包括发消息的人)?输出收到消息的人数(以十进制整数输出,不需要加换行符)

    输入描述:

    发第一条消息的人名

    群组个数m

    群组1成员人名列表

    群组2成员人名列表

    ....

    群组m成员人名列表

    人名是英文字符串,包含英文字母和空格,最大长度不超过100字符。

    群组个数m是十进制整数,最大不超过100。

    群组成员人名列表包含1至多个人名,两个人名之间以逗号分隔。

    输出描述:

    以十进制输出最后能受到消息的人数。

    示例:

    输入:

    Jack
    3
    Jack,Tom,Anny,Lucy
    Tom,Danny
    Jack,Lily

    输出:

    6

    思路:

    先统计所有人名所在的组号,然后按照BFS去遍历;(注意只有Jack一个人一组,而没有包含在其他组的情况,这时候应该输出1)

     1 #include <iostream>
     2 #include <vector> 
     3 #include <bits/stdc++.h> 
     4 using namespace std;
     5 
     6 vector<string> pro(string& str){
     7     vector<string> res;
     8     int index =0;
     9     for(int i=0;i<str.size(); i++){
    10         if(str[i]==','){
    11             res.push_back(str.substr(index, i-index) );
    12             index = i+1;
    13         }
    14     }
    15     if(index<str.size()){
    16         res.push_back(str.substr(index));
    17     }
    18     return res;
    19 }
    20 
    21 int main(){
    22     string name;
    23     while(cin>>name){
    24         int m;
    25         cin>>m;
    26         
    27         string cur;
    28         vector<vector<string> > data;
    29         for(int i=0; i<m; i++){ 
    30             cin>>cur;
    31             data.push_back(  pro(cur ) );
    32         }
    33         
    34         map<string, vector<int> > exist;
    35         
    36         for(int i=0;i<data.size(); i++){
    37             for(int j=0; j<data[i].size();j++ ){
    38                 exist[ data[i][j] ].push_back(i) ;                
    39             } 
    40         }
    41         
    42         queue<int> temp;         
    43         for(int i=0; i<exist[name].size(); i++){
    44             temp.push( exist[name][i] );
    45         }
    46         
    47         vector<int> visited(m,0);
    48         set<string> res; 
    49         res.insert(name);    
    50         
    51         while(!temp.empty()){
    52             int cur = temp.front();
    53             temp.pop();
    54             visited[cur] = 1;
    55             for(int i=0; i<data[cur].size(); i++){
    56                 for(int j=0; j< exist[ data[cur][i]  ].size(); j++ ){
    57                     if( !visited[ exist[  data[cur][i]  ][j] ]  )    {
    58                         temp.push( exist[ data[cur][i] ][j] );
    59                     }                     
    60                 }                
    61                 res.insert( data[cur][i] );
    62             }
    63         }         
    64         cout<<res.size();         
    65     }     
    66 }
  • 相关阅读:
    java——io、字节流缓冲区拷贝文件、字节缓冲流
    java——斗地主小游戏之洗牌发牌
    java——HashMap、Hashtable
    java——模拟新浪微博用户注册
    [bzoj 1492][NOI2007]货币兑换Cash
    [bzoj 1010][HNOI 2008]玩具装箱
    [bzoj 2875][noi2012]随机数生成器
    [bzoj 4872][六省联考2017]分手是祝愿
    [bzoj 3566][SHOI 2014]概率充电器
    [bzoj 3534][Sdoi2014] 重建
  • 原文地址:https://www.cnblogs.com/liugl7/p/11391332.html
Copyright © 2011-2022 走看看