【招行】信用卡推荐用户列表 数据岗

■題目描述
现在信用卡开展营销活动,持有我行信用卡客户推荐新户办卡,开卡成功后可获得积分奖励。规定每个客户最多可推荐两个新户且一个新户只能被推荐一次。但允许链接效应,即若客户A推荐了新户B,新户B推荐新户C,则客户同时属于A和B的推荐列表。简单起见,只考虑一个老客户A作起点推荐的情况。编程计算推荐新户数不小于n的客户列表。
■输入描述
输入的第一行为以空格分隔的两个正整数,第一个表示原始推荐列表的 个数m,第二个表示n的取值。
其后m每行均为一个以空格分隔的原始推荐列表,第一列为推荐人,后面两列为被推荐人,若该推荐人只推荐了一个新户,则第三列以*替代。 推荐人和被推荐人均以大写字母表示,不同字母代表不同的人。
■输出描述:
在同一行输出符合条件的客户列表,无顺序要求,客户间以空格分隔。 若客户列表为空,则输出None。详见祥例。

 示例1

输入:

5 2

A  B  C

C  F  *

B  D  E 

D  G  *

E  H  I  

输出

A  B  E

解题思路:

由于链接效应,比较适合的就有链表结构,二叉树结构和递归。

Solution 1

#include <vector>
#include <map>
#include <string>
#include <iostream>
using namespace std;
 
int OutputBigClient(map<string, pair<string, string>> &r, int n,
    string &head, vector<string> &output){
 
    if (head == "*")    return -1;
    if (r.find(head) == r.end()){
        if (n == 0)    output.push_back(head);
        return 0;
    }
    int ans = 2;
    ans += OutputBigClient(r, n, r[head].first, output);
    ans += OutputBigClient(r, n, r[head].second, output);
    if (ans >= n)
        output.push_back(head);
    return ans;
}
int main() {
    int m, n;
    cin >> m;
    cin >> n;
    map<string, pair<string, string>> rec_list;
    vector<string> output;
    string x, y, z;
    for (int i = 0; i < m; i++){
        cin >> x >> y >> z;
        rec_list[x] = make_pair(y, z);
    }
    x = "A";
    OutputBigClient(rec_list, n, x, output);
    if (!output.empty()){
        cout << output[0];
        for (int i = 1; i < output.size(); ++i){
            cout << " " << output[i];
        }
        cout << endl;
    }
    else
    {
        cout << "None" << endl;
    }
    //system("Pause");
    return 0;
}

(作者:吃橘子不吐皮
链接:https://www.nowcoder.com/discuss/41237
来源:牛客网)

Solution 2

m, n= [int(i) for i in raw_input().split()]
 
referDict = {}
for _ in range(m):
    referList = raw_input().strip().split()
    if referList[0] not in referDict:
        referDict[referList[0]] = '*'
    if not referList[1] == '*':
        referDict[referList[1]] = referList[0]
    if not referList[2] == '*':
        referDict[referList[2]] = referList[0]
 
referNum = {i:0 for i in referDict.keys()}
 
for i in referDict:
    aa= i
    while referDict[aa] in referNum:
        aa = referDict[aa]
        referNum[aa] += 1
 
resultList = []
for k,v in referNum.iteritems():
    if v>=n:
        resultList.append(k)
 
if len(resultList)==0:
    print "None"
else:
    print " ".join(resultList)
(作者:呵呵了呀
链接:https://www.nowcoder.com/discuss/41134
来源:牛客网)
原文地址:https://www.cnblogs.com/Atanisi/p/7524863.html