首页 > 试题广场 >

谁是你的潜在朋友

[编程题]谁是你的潜在朋友
  • 热度指数:18119 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
    “臭味相投”——这是我们描述朋友时喜欢用的词汇。两个人是朋友通常意味着他们存在着许多共同的兴趣。然而作为一个宅男,你发现自己与他人相互了解的机会并不太多。幸运的是,你意外得到了一份北大图书馆的图书借阅记录,于是你挑灯熬夜地编程,想从中发现潜在的朋友。     首先你对借阅记录进行了一番整理,把N个读者依次编号为1,2,…,N,把M本书依次编号为1,2,…,M。同时,按照“臭味相投”的原则,和你喜欢读同一本书的人,就是你的潜在朋友。你现在的任务是从这份借阅记录中计算出每个人有几个潜在朋友。

输入描述:
    每个案例第一行两个整数N,M,2 <= N ,M<= 200。接下来有N行,第i(i = 1,2,…,N)行每一行有一个数,表示读者i-1最喜欢的图书的编号P(1<=P<=M)


输出描述:
    每个案例包括N行,每行一个数,第i行的数表示读者i有几个潜在朋友。如果i和任何人都没有共同喜欢的书,则输出“BeiJu”(即悲剧,^ ^)
示例1

输入

4  5
2
3
2
1

输出

1
BeiJu
1
BeiJu

python解法,使用Counter

from collections import Counter
while True:
    try:
        a,b=map(int,input().split())
        res=[]
        for i in range(a):
            res.append(int(input()))
        c=Counter(res)
        for i in res:
            print(c[i]-1 if c[i]>1 else "BeiJu")
    except:
        break
发表于 2017-10-17 17:58:27 回复(0)
#include<bits/stdc++.h>
using namespace std;

int main()
{
    int n,m;
    while(cin>>n>>m)
    {
        map<int,int>likeCount;//建立喜欢某本书的人数
        int reader[n];//记录读者最喜欢哪本书
        for(int i=0;i<n;i++)
        {
            int num;
            cin>>num;
            likeCount[num]++;
            reader[i]=num;
        }
        for(int i=0;i<n;i++)
        {
            if(likeCount[reader[i]]>1)//大于一说明至少有两个人喜欢这本书
                cout<<likeCount[reader[i]]-1<<endl;
            else
                cout<<"BeiJu"<<endl;
        }
    }
    return 0;
}

发表于 2022-03-21 11:18:26 回复(0)
#include<bits/stdc++.h>
using namespace std;
map<int ,int>num;
const int maxx=205;
int book[maxx];//存放读者i喜欢的书的编号
int main()
{
    int n,m;
    while(cin>>n>>m)
    {
        for(int i=0;i<n;i++)
        {
            int x;
            cin>>book[i];
            x=book[i];
            num[x]++;//映射值加一;
        }
        map<int,int>::iterator it;
        for(int i=0;i<n;i++)
        {
            if(num[book[i]]==1)
                cout<<"BeiJu"<<endl;
            else
            {    
                int ans=num[book[i]]-1;
                cout<<ans<<endl;
            }
        }
        
    }
    return 0;
}

发表于 2020-04-02 17:44:40 回复(0)
#include<stdio.h>//1.直接全部的人进行比较除去自己跟自己比较
int main()//2.建立新数组 有相同的人数加一  人数为0则输出BeiJu
{
    int n,m,i,j,a[200],b[200],num;
    scanf("%d%d",&n,&m);//输入
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(i=1;i<=n;i++)
    {
        num=0;
        for(j=1;j<=n;j++)
        {
            if(i!=j)//别跟自己比较
                if(a[i]==a[j])
                    num++;
        }
        b[i]=num;
    }
    for(i=1;i<=n;i++)
    {
        if(b[i]==0) printf("BeiJu\n");
        else printf("%d\n",b[i]);
    }
}

发表于 2020-03-31 11:54:05 回复(2)
//map加数组实现
#include<iostream>
(720)#include<cstdio>
#include<map>
using namespace std;
int main(){
    int m,n,x;
    int number[200];
    map<int,int>    myMap;
    while(scanf("%d%d",&n,&m)!=EOF){
        myMap.clear();
        for(int i=0;i<n;i++){
            scanf("%d",&x);
            number[i]=x;
            myMap[x]++;
        }
        for(int i=0;i<n;i++){
            if(myMap[number[i]]==1)
                printf("BeiJu\n");
            else
                printf("%d\n",myMap[number[i]]-1);
        }
    }
    return 0;
}

发表于 2020-03-20 16:46:56 回复(0)
#include <iostream>
#include <map>
#include <vector>
using namespace std;

int main(){ 
	int n,m;
	while(cin>>n>>m){
		vector<int> vec(n);
		map<int,int> ma;

		for(auto& a:vec){
			cin>>a;
			ma[a]++;
		}

		for(const auto& a:vec){
			auto& t =ma[a];
			if(t==1)
				cout<<"BeiJu"<<endl;
			else 
				cout<<t-1<<endl;
		}
	}
	return 0;
}
map和vector应用
编辑于 2020-02-26 18:58:44 回复(0)
终于有一题一次就过了,难道是我变强了吗🤭🤭🤭
#include "stdio.h"

int main(){
    int n, m, a[200],b[200],i,j;
    while(~scanf("%d%d",&n, &m)){
        for(i = 0; i < n; i++){
            scanf("%d",&a[i]);
            b[i] = 0;
        }
        //比较两个同学喜欢的书籍是否一致,
        //一致则将记录每个同学潜在好友数的数组+1
        for(i = 0;i < n; i++){
            for(j = 0; j < n; j++){
                if(a[i] == a[j]) b[i] += 1;
            }
            b[i] -= 1;//把兴趣和自己一样的自己剪掉
        }
        for(i = 0; i < n; i ++){
            if(b[i] == 0) printf("BeiJu\n");
            else printf("%d\n",b[i]);
        }
    }
    return 0;
}

发表于 2019-06-24 15:00:50 回复(1)
#include <cstdio>
#include <unordered_map>
#include <vector>
using namespace std;

const int MAXN = 300;
unordered_map<int, vector<int> > mp;
int friend_num[MAXN];

int main() {
    int n, m;
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++)  {
        int book;
        scanf("%d", &book);
        mp[book].push_back(i);
    }

    for (auto it = mp.begin(); it != mp.end(); it++) {
        for (int i = 0; i < it->second.size(); i++) {
            friend_num[it->second[i]] = it->second.size();
        }
    }

    for (int i = 1; i <= n; i++) {
        if (friend_num[i] == 1) printf("BeiJu\n");
        else printf("%d\n", friend_num[i] - 1);
    }
    return 0;
}
发表于 2019-03-11 15:06:47 回复(0)
感觉这题还是比较基础的hhh
#include<iostream>
using namespace std;
int main(){
    int n,m;
    cin>>n>>m;
    int* book=new int[n];
    for(int i=0;i<n;i++)
        cin>>book[i];
    int* friends=new int[n];
    for(int i=0;i<n;i++)
        friends[i]=0;
    for(int i=0;i<n;i++){
        for(int j=i+1;j<n;j++){
            if(book[i]== book[j]){
                friends[i]++;
                friends[j]++;
            }
        }
    }
    for(int i=0;i<n;i++){
        if(friends[i]==0)
            cout<<"BeiJu"<<endl;
        else
            cout<<friends[i]<<endl;
    }
}

发表于 2019-02-06 21:22:11 回复(1)
#include <iostream>
#include <stdio.h>

using namespace std;

int main(){
    int N,M,i=0;
    cin>>N>>M;
    int Stu[N];
    int Book_Stu[M];
    
    for(i=0;i<M;i++)
    Book_Stu[i]=0;

    for(i=0;i<N;i++){
        cin>>Stu[i];
        Book_Stu[Stu[i]]++;
    }
    for(i=0;i<N;i++){
        if(Book_Stu[Stu[i]]>1) cout<<Book_Stu[Stu[i]]-1<<endl;
        else cout<<"BeiJu"<<endl;

    }
    return 0;
}
发表于 2018-05-04 17:19:46 回复(0)
#include<stdio.h>
int main()
{
    int i,d;
    int N,M;
    while(scanf("%d %d",&N,&M)!=EOF)
    {
        int reader[201]={0},book[201]={0};
        for(i=1;i<=N;i++)
        {
             scanf("%d",&d);
             reader[i]=d;
             book[d]++;
        }
        for(i=1;i<=N;i++)
        {
            if(book[reader[i]]==1)
                printf("BeiJu\n");
            else printf("%d\n",book[reader[i]]-1);
        }
    }
    return 0;
}


发表于 2017-02-26 22:38:03 回复(1)
#include<iostream>
using namespace std;
int main(){
    int n,m;    
    cin>>n>>m;
    int a[n];
    for(int i=0;i<n;i++){
        cin>>a[i];       
    }
    for(int i=0;i<n;i++){
        int count =0;
        for(int j=i+1;j<n;j++){
            if(a[i]==a[j]){
                count++;
            }
        }
        for(int j =0;j<i;j++){
            if(a[i]==a[j]){
                count++;
            }
        }
        if(count==0){
            cout<<"BeiJu"<<endl;
        }
        else
        cout<<count<<endl;
    }
}



发表于 2022-04-05 15:47:48 回复(0)
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int n, m, a[300];
	cin >> n;
	cin >> m;
	for(int i=0; i<n; i++)
		cin >> a[i];
	for(int i=0; i<n; i++)
	{
		if(count(a, a+n, a[i]) > 1)
			cout << count(a, a+n, a[i])-1 << endl;
		else
			cout << "BeiJu" << endl;
	}
	return 0;
}

发表于 2021-02-26 16:30:44 回复(0)
#include<iostream>
(720)#include<cstdio>
#include<map>

using namespace std;

int main(){
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF){
        map<int,int> book_num;//map<书编号,人数>
        map<int,int> stu_book;//map<读者号,书编号>
        for(int i=0;i<n;i++){//第i个读者
            int bookNumber;
            scanf("%d",&bookNumber);
            stu_book[i]=bookNumber;//第i个读者喜欢看的书编号为bookNumber;
            book_num[bookNumber]++;//同时把喜欢看书编号为bookNumber的人数+1
        }
        map<int,int>::iterator it;
        for(it=stu_book.begin();it!=stu_book.end();it++){//读者号从0~n-1
            int num=book_num[it->second]-1;//把自己减掉
            if(num==0){
                printf("BeiJu\n");
            }else{
                cout<<num<<endl;
            }
        }
    }
    return 0;
}
发表于 2020-03-08 21:07:11 回复(0)
#include <iostream>
#include<map>
using namespace std;

int main() {
    int n,m;
    cin>>n>>m;
    map<int,int>book;
    map<int,int>person;
    for(int i=1;i<=n;i++){
        int t;
        cin>>t;
        person[i]=t;
        book[t]++;
    }
    for(int j=1;j<=n;j++){
        if((book[person[j]]-1)==0) cout<<"BeiJu"<<endl;
        else cout<<book[person[j]]-1<<endl;
    }
    return 0;
}

编辑于 2024-03-19 14:47:28 回复(0)
#include <iostream>
#include <algorithm>
using namespace std;
const int N=210;

int n,m;
int ren[N];//里面放他喜欢的书的编号
int fd[N];


int main() {
    
    scanf("%d%d",&n,&m);//N个读者,M本书
    for(int i=1;i<=n;i++){
        scanf("%d",&ren[i]);
    }

    for(int i=1;i<=n;i++){//一个读者一个读者的找
        for(int j=1;j<=n;j++){//每个读者遍历一遍
            if(ren[i]==ren[j] && (i!=j)){
                fd[i]++;//该读者朋友+1
            }
        }
    }

    for(int i=1;i<=n;i++){
        if(fd[i]!=0) printf("%d\n",fd[i]);
        else printf("BeiJu\n");
    }



    return 0;
}

编辑于 2024-02-15 15:20:55 回复(0)
#include <cstdio>
#include <cstring>

int main() {
    int N,M;
    while(scanf("%d%d",&N,&M) != EOF){
        int book[210];  //存储某书对应的读者数量
        int index[210];//存储输入的书的编号
        memset(book,0,sizeof(book));
        memset(index,0,sizeof(index));
        for(int i = 0; i < N; ++i){
            scanf("%d",&index[i]);
            book[index[i]]++;
        }
        for(int i = 0; i < N; ++i){
            if(book[index[i]] > 1){
                printf("%d\n",book[index[i]]-1);
            }else{
                printf("BeiJu\n");
            }
        }
    }
    return 0;
}

编辑于 2024-01-21 10:52:06 回复(0)
#include <iostream>
using namespace std;
int stu[10010],books[210];
int main(int argc, char const *argv[])
{
	int n,m;
    scanf("%d %d",&n,&m);
	int fa_book;
	for(int i = 0;i<n;i++)
	{	
		scanf("%d",&fa_book);
		stu[i] = fa_book;
		books[fa_book]++;
	}
	int flag;
	for(int i = 0;i<n;i++){
		flag = books[stu[i]] - 1;
		if(flag == 0 )
			printf("BeiJu\n");
		else
			printf("%d\n",flag);
	}
	return 0;
}

发表于 2023-03-09 16:38:33 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int[] book = new int[m];
        int[] reader = new int[n];
        for(int i = 0; i < n; i++){
            reader[i] = sc.nextInt();
            book[reader[i]]++;
        }
        for(int i = 0; i < n; i++){
            if(book[reader[i]] == 1)
                System.out.println("BeiJu");
            else
                System.out.println(book[reader[i]]-1);
        }
        sc.close();
    }
}
发表于 2019-07-05 11:16:48 回复(0)
先用map维护喜欢同一本书的人,再用一个向量维护每个人朋友的个数
ps:也可以用两个数组思路和实现更简单
#include <iostream>
#include<map>
#include<vector>
using namespace std;

int main() {
    int n,m;
    while (scanf("%d %d",&n,&m)!=EOF) {
        map<int,vector<int> >mym;//前面代表书的编号,后面向量代表喜欢同一本书的人
        for(int i=0;i<n;i++){
            int temp;
            scanf("%d",&temp);
            mym[temp].push_back(i+1);//temp没有找到则创建并添加
        }
        map<int,vector<int> >::iterator it;
        vector<int>id(n+1);
        for(it=mym.begin();it!=mym.end();it++){
            for(int i=0;i<it->second.size();i++){
                id[it->second[i]]=it->second.size();
            }
        }
        for(int i=1;i<n+1;i++){
            //从1开始
            if(id[i]>1){
                printf("%d\n",id[i]-1);
            }else if(id[i]==1){
                printf("BeiJu\n");
            }
        }
    }
    return 0;
}
// 64 位输出请用 printf("%lld")


发表于 2025-03-20 16:04:02 回复(0)