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

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

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;
}
目录
相关文章
|
6月前
|
消息中间件 Linux API
C/C++ 进程间通信system V IPC对象超详细讲解(系统性学习day9)
C/C++ 进程间通信system V IPC对象超详细讲解(系统性学习day9)
|
C语言 C++ Windows
【c++】设置控制台窗口字体颜色和背景色(system和SetConsoleTextAttribute函数 )(内含超好玩的c++游戏链接)
【c++】设置控制台窗口字体颜色和背景色(system和SetConsoleTextAttribute函数 )(内含超好玩的c++游戏链接)
646 0
【c++】设置控制台窗口字体颜色和背景色(system和SetConsoleTextAttribute函数 )(内含超好玩的c++游戏链接)
|
C++
【PAT甲级 - C++题解】1040 Longest Symmetric String
【PAT甲级 - C++题解】1040 Longest Symmetric String
66 0
|
算法 C++
【PAT甲级 - C++题解】1044 Shopping in Mars
【PAT甲级 - C++题解】1044 Shopping in Mars
82 0
|
C++
【PAT甲级 - C++题解】1117 Eddington Number
【PAT甲级 - C++题解】1117 Eddington Number
77 0
|
存储 C++ 容器
【PAT甲级 - C++题解】1057 Stack
【PAT甲级 - C++题解】1057 Stack
76 0
|
存储 C++
【PAT甲级 - C++题解】1055 The World‘s Richest
【PAT甲级 - C++题解】1055 The World‘s Richest
78 0
|
C++
【PAT甲级 - C++题解】1051 Pop Sequence
【PAT甲级 - C++题解】1051 Pop Sequence
79 0
|
人工智能 BI C++
【PAT甲级 - C++题解】1148 Werewolf - Simple Version
【PAT甲级 - C++题解】1148 Werewolf - Simple Version
135 0
|
存储 定位技术 C++
【PAT甲级 - C++题解】1091 Acute Stroke
【PAT甲级 - C++题解】1091 Acute Stroke
58 0