【山科OJ】Problem A: 社交网络的好友推荐

Description

Jack同学在人人网上注册了一个用户,发现人人网需要回答一些问题,而后网站根据自己的回答向自己推荐了一些具有相似回答的网友。Jack同学恰好正在学习编程,想编写一个程序来模拟这个好友推荐功能。

为了实现这一目标,Jack同学是这样设想的:假定网络中的注册用户不超过N个,每位用户注册时需回答M个问题(每个问题都是选择题,且是单选),并指定一个阈值Q。设Tom和Mary是两个注册用户,而且Tom和Mary设定的阈值分别是Q1和Q2,那么:

(1)当且仅当Tom与Mary对M个问题的回答有不少于Q1个是相同答案时,才可以向Tom推荐Mary。

(2)当且仅当Tom与Mary对M个问题的回答有不少于Q2个是相同答案时,才可以向Mary推荐Tom。

现在,我们已经知道了N个用户对M个问题的答案以及设定的阈值Q,请帮Jack设计一个程序来模拟好友推荐功能。

Input

 输入是多行的。第一行包含两个整数,分别是N和M的值,代表用户个数及问题个数,且0<N<=100、0<M<=20。

从第二行开始,每行表示一个用户给出的M个问题的答案。其中第一个字符串是用户名(不超过20个字符,且仅含字母、数字和下划线);之后是一个空格和M个大写字母A~Z,第j个字母表示该用户的第j个答案,而且两个字母之间用一个空格隔开;最后是一个整数,表示该用户设定的阈值。

比如在Sample Input中,有5名用户,10个问题。用户是Jack、Tom、Jackson、Mammal_1、Bill_Gates。其中Tom给出的10个问题的答案是A B C D E A B A D E,且指定的阈值是9。

Output

输出也是多行,每一行代表为一个用户推荐的好友列表。其顺序与输入顺序相同:即按照输入的用户名顺序给出为每个用户推荐的好友。

每一行的格式是:第一个字符串是用户名,之后是好友列表,两者之间用冒号隔开。好友列表是向该行指定的用户推荐的好友用户名,按照输入顺序顺次输出好友的用户名。如果该行指定的用户没有可以推荐的好友,则输出“NONE!”。

输出的对齐要求是:每行指定的用户名(即向其推荐好友的用户名)的输出宽度是所有用户中最长的用户名占用的宽度,且左对齐。好友列表中的用户名的输出宽度是用户名的实际宽度,且两两之间用逗号(半角)隔开。    

Sample Input

5 10

Bill_Gates A A A A A B B B B B 3

Tom A B C D E A B A D E 9

Jackson A A A A A B B B B B 4

Mammal_1 B B B B B B B B B B 6

Jack A B A D E A B C A E 5

Sample Output

Bill_Gates:Jackson,Mammal_1,Jack

Tom :NONE!

Jackson :Bill_Gates,Mammal_1

Mammal_1 :NONE!

Jack :Tom

HINT

每个用户指定的阈值是不同的,所以可以向Tom推荐Mary,不代表可以向Mary推荐Tom。

Append Code

#include<stdio.h>
#include<string.h>
#define LenN 101
#define LenM 21
typedef struct
{
    char n[21]; // 昵称
    char m[LenM]; //选项
    int a; //阈值
}Peo;

int main()
{
    int x,y,max=0;
    scanf("%d %d",&x,&y);
    Peo Na[x];
    for(int i=0;i<x;i++)
    {
        scanf("%s",Na[i].n);
        if(strlen(Na[i].n)>max)//计算名字最长的人名字长度,为了对其补空格
        {
            max=strlen(Na[i].n);
        }
        for(int j=0;j<=y;j++) //输入选项
        {
            scanf("%c ",&Na[i].m[j]);
        }
        scanf("%d",&Na[i].a); //输入每个人的阈值
    }

    for(int i=0;i<x;i++)
    {
        printf("%s",Na[i].n);
        if(strlen(Na[i].n)<max) //不是最长名字,补齐空格
        {
            for(int j=0;j<max-strlen(Na[i].n);j++)
            {
                printf(" ");
            }
        }
        printf(":");
        int f=0;
        for(int k=0;k<x;k++)
        {
            if(k==i) k++;
            int flag=0;
            for(int l=1;l<=y;l++)
            {
                if(Na[i].m[l]==Na[k].m[l]) flag++;//判断每个选项是否相等
            }
            if(flag>=Na[i].a)
            {
                if(f!=0) printf(",");
                printf("%s",Na[k].n);
                f++; //判断有几个好友
            }
        }
        if(f==0)printf("NONE!");
        if(i!=x-1)printf("\n");
    }
    return 0;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值