【PAT甲级 - C++题解】1129 Recommendation System

✍个人博客:https://blog.csdn.net/Newin2020?spm=1011.2415.3001.5343
📚专栏地址:PAT题解集合
📝原题地址:题目详情 - 1129 Recommendation System (pintia.cn)
🔑中文翻译:推荐系统
📣专栏定位:为想考甲级PAT的小伙伴整理常考算法题解,祝大家都能取得满分!
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

1129 Recommendation System

Recommendation system predicts the preference that a user would give to an item. Now you are asked to program a very simple recommendation system that rates the user’s preference by the number of times that an item has been accessed by this user.

Input Specification:

Each input file contains one test case. For each test case, the first line contains two positive integers: N (≤ 50,000), the total number of queries, and K (≤ 10), the maximum number of recommendations the system must show to the user. Then given in the second line are the indices of items that the user is accessing – for the sake of simplicity, all the items are indexed from 1 to N. All the numbers in a line are separated by a space.

Output Specification:

For each case, process the queries one by one. Output the recommendations for each query in a line in the format:

query: rec[1] rec[2] ... rec[K]

where query is the item that the user is accessing, and rec[i] (i=1, … K) is the i-th item that the system recommends to the user. The first K items that have been accessed most frequently are supposed to be recommended in non-increasing order of their frequencies. If there is a tie, the items will be ordered by their indices in increasing order.

Note: there is no output for the first item since it is impossible to give any recommendation at the time. It is guaranteed to have the output for at least one query.

Sample Input:

12 3
3 5 7 5 5 3 2 1 8 3 8 12

Sample Output:

5: 3
7: 3 5
5: 3 5 7
5: 5 3 7
3: 5 3 7
2: 5 3 7
1: 5 3 2
8: 5 3 1
3: 5 3 1
8: 3 5 1
12: 3 5 8
题意

现在给出用户访问的 N 件物品,需要我们输出用户每次访问时推荐给他的 K 件物品。推荐的物品需要按照其之前访问的物品按访问次数降序排序,输出前 K 个物品,如果出现访问次数相同的物品则按照物品的编号升序输出,为了简化。所有物品的编号都是从 1~N

注意,用户第一次访问时是没有推荐记录的。

思路

具体思路如下:

  1. 除了第一次访问,每次访问都要先输出给用户推荐其最喜好的 k 件物品,并每访问一次就 cnt[id]++
  2. 判断用户是否已经存在与推荐列表当中,如果已经存在则不需要再加入推荐列表;反之,需要加入推荐列表中。
  3. 对推荐列表中的物品进行排序,然后更新 k 的值,而 k 不能大于 m ,因为最多只推荐 m 个 物品,如果不够 m 个则只推荐 k 个物品。
代码
#include<bits/stdc++.h>
using namespace std;

const int N = 50010;
int cnt[N], top_k[11];
int n, m;

int main()
{
    cin >> n >> m;

    int k = 0;
    for (int i = 0; i < n; i++)
    {
        int id;
        scanf("%d", &id);
        cnt[id]++;  //增加该商品浏览次数

        //第一次访问没有任何输出
        if (i)
        {
            printf("%d:", id);
            for (int j = 0; j < k; j++)    printf(" %d", top_k[j]);
            puts("");
        }

        //判断当前商品是否已在推荐列表当中
        bool exists = false;
        for (int j = 0; j < k; j++)
            if (top_k[j] == id)
            {
                exists = true;
                break;
            }

        //如果不在列表中需要加入列表,和之前推荐商品一起排序
        if (!exists)  top_k[k++] = id;
        sort(top_k, top_k + k, [](int x, int y) {
            if (cnt[x] != cnt[y])   return cnt[x] > cnt[y];
            return x < y;
            });

        //最多只显示m个商品,不足m个则显示k个
        k = min(k, m);
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值