列表

详情


CMB8. 信用卡推荐客户列表

描述

现在信用卡开展营销活动,持有我行信用卡客户推荐新户办卡,开卡成功后可获得积分奖励。规定每个客户最多可推荐两个新户且一个新户只能被推荐一次。但允许链接效应,即若客户A推荐了新户B,新户B推荐新户C,则客户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

原站题解

C 解法, 执行用时: 1ms, 内存消耗: 368KB, 提交时间: 2020-12-23

#include <stdio.h>
#include <stdlib.h>
     
int dfs(int a[26][26],int node,int size)
{
    int i;
    int length=0;
    for(i=0;i<size;i++)
        if(a[node][i]==1){
            length+=1;
            length+=dfs(a,i,size);
        }
    return length;
}
int main()
{
    int m,n;
    int i,j;
    int a[26][26];
    int b[26]={0};
    char old,new1,new2;
    int count=0;
    scanf("%d %d",&m,&n);
    for(i=0;i<26;i++)
        for(j=0;j<26;j++)
            a[i][j]=0;
     
    if(n!=0){
        for(i=0;i<m;i++){
            getchar();
            scanf("%c %c %c",&old,&new1,&new2);
            if(new1!='*')
                a[old-'A'][new1-'A']=1;
            if(new2!='*')
                a[old-'A'][new2-'A']=1;
        }
        for(i=0;i<26;i++){
            if(dfs(a,i,26)>=n){
                count=1;
                printf("%c ",i+'A');
        }
    }
        if(count==0)
            printf("None");
    }
    else{
        for(i=0;i<m;i++){
            getchar();
            scanf("%c %c %c",&old,&new1,&new2);
            if(b[old-'A']!=1){
                printf("%c ",old);
                b[old-'A']=1;
            }
            if(new1!='*'&&b[new1-'A']!=1){
                printf("%c ",new1);
                b[new1-'A']=1;
            }
            if(new2!='*'&&b[new2-'A']!=1){
                printf("%c ",new2);
                b[new2-'A']=1;
            }
        }
             
    }
         
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 372KB, 提交时间: 2019-04-30

#include <stdio.h>
#include <stdlib.h>
   
int dfs(int a[26][26],int node,int size)
{
    int i;
    int length=0;
    for(i=0;i<size;i++)
        if(a[node][i]==1){
            length+=1;
            length+=dfs(a,i,size);
        }
    return length;
}
int main()
{
    int m,n;
    int i,j;
    int a[26][26];
    int b[26]={0};
    char old,new1,new2;
    int count=0;
    scanf("%d %d",&m,&n);
    for(i=0;i<26;i++)
        for(j=0;j<26;j++)
            a[i][j]=0;
   
    if(n!=0){
        for(i=0;i<m;i++){
            getchar();
            scanf("%c %c %c",&old,&new1,&new2);
            if(new1!='*')
                a[old-'A'][new1-'A']=1;
            if(new2!='*')
                a[old-'A'][new2-'A']=1;
        }
        for(i=0;i<26;i++){
            if(dfs(a,i,26)>=n){
                count=1;
                printf("%c ",i+'A');
        }
    }
        if(count==0)
            printf("None");
    }
    else{
        for(i=0;i<m;i++){
            getchar();
            scanf("%c %c %c",&old,&new1,&new2);
            if(b[old-'A']!=1){
                printf("%c ",old);
                b[old-'A']=1;
            }
            if(new1!='*'&&b[new1-'A']!=1){
                printf("%c ",new1);
                b[new1-'A']=1;
            }
            if(new2!='*'&&b[new2-'A']!=1){
                printf("%c ",new2);
                b[new2-'A']=1;
            }
        }
           
    }
       
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 376KB, 提交时间: 2019-05-16

#include <stdio.h>
#include <stdlib.h>
     
int dfs(int a[26][26],int node,int size)
{
    int i;
    int length=0;
    for(i=0;i<size;i++)
        if(a[node][i]==1){
            length+=1;
            length+=dfs(a,i,size);
        }
    return length;
}
int main()
{
    int m,n;
    int i,j;
    int a[26][26];
    int b[26]={0};
    char old,new1,new2;
    int count=0;
    scanf("%d %d",&m,&n);
    for(i=0;i<26;i++)
        for(j=0;j<26;j++)
            a[i][j]=0;
     
    if(n!=0){
        for(i=0;i<m;i++){
            getchar();
            scanf("%c %c %c",&old,&new1,&new2);
            if(new1!='*')
                a[old-'A'][new1-'A']=1;
            if(new2!='*')
                a[old-'A'][new2-'A']=1;
        }
        for(i=0;i<26;i++){
            if(dfs(a,i,26)>=n){
                count=1;
                printf("%c ",i+'A');
        }
    }
        if(count==0)
            printf("None");
    }
    else{
        for(i=0;i<m;i++){
            getchar();
            scanf("%c %c %c",&old,&new1,&new2);
            if(b[old-'A']!=1){
                printf("%c ",old);
                b[old-'A']=1;
            }
            if(new1!='*'&&b[new1-'A']!=1){
                printf("%c ",new1);
                b[new1-'A']=1;
            }
            if(new2!='*'&&b[new2-'A']!=1){
                printf("%c ",new2);
                b[new2-'A']=1;
            }
        }
             
    }
         
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 376KB, 提交时间: 2018-08-16

#include <stdio.h>
#include <stdlib.h>

int dfs(int a[26][26],int node,int size) //acylic graph
{
    int i;
    int length=0;
    for(i=0;i<size;i++)
        if(a[node][i]==1){
            //printf("%c %c\n",node+'A',i+'A');
            length+=1;
            length+=dfs(a,i,size);
        }
    return length;
}
int main()
{
    int m,n;
    int i,j;
    int a[26][26];
    int b[26]={0};
    char old,new1,new2;
    int count=0;
    scanf("%d %d",&m,&n);
    for(i=0;i<26;i++)
        for(j=0;j<26;j++)
            a[i][j]=0;

    if(n!=0){
        for(i=0;i<m;i++){
            getchar();
            scanf("%c %c %c",&old,&new1,&new2);
            //printf("%c %c %c\n",old,new1,new2);       
            if(new1!='*')
                a[old-'A'][new1-'A']=1;
            if(new2!='*')
                a[old-'A'][new2-'A']=1;
        }
        for(i=0;i<26;i++){
            if(dfs(a,i,26)>=n){
                count=1;
                printf("%c ",i+'A');
        }
    }
        if(count==0)
            printf("None");
    }
    else{
        for(i=0;i<m;i++){
            getchar();
            scanf("%c %c %c",&old,&new1,&new2);
            if(b[old-'A']!=1){
                printf("%c ",old);
                b[old-'A']=1;
            }
            if(new1!='*'&&b[new1-'A']!=1){
                printf("%c ",new1);
                b[new1-'A']=1;
            }
            if(new2!='*'&&b[new2-'A']!=1){
                printf("%c ",new2);
                b[new2-'A']=1;
            }
        }
        
    }
    
    return 0;
    
    

}

C++ 解法, 执行用时: 2ms, 内存消耗: 400KB, 提交时间: 2020-07-21

#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
int getNum(char ch,map<char,vector<char>>&m,vector<char>&ret,int n)
{
    if(m.find(ch)==m.end())
    {
        if(0>=n)ret.push_back(ch);
        return 0;
    }
    int len=m[ch].size();
    int curNum=0;
    for(int i=0;i<len;i++)
    {
        curNum+=getNum(m[ch][i],m,ret,n)+1;
    }
    if(curNum>=n)ret.push_back(ch);
    return curNum;
}
int main()
{
    int m,n;cin>>m>>n;
    map<char,vector<char>>hash;
    for(int i=0;i<m;i++)
    {
        char x,y,z;
        cin>>x>>y>>z;
        if(z!='*')hash[x]=vector<char>{y,z};
        else hash[x]=vector<char>{y};
    }
    vector<char>ret;
    getNum('A',hash,ret,n);
    sort(ret.begin(),ret.end());
    if(ret.empty())cout<<"None"<<endl;
    else{
        for(int i=0;i<ret.size();i++)
        {
            if(i==0)cout<<ret[i];
            else cout<<" "<<ret[i];
        }
        cout<<endl;
    }
}

上一题