【PAT】1129.Recommendation System` (25)【Set集合使用】

题目描述

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.

翻译:每个输入文件包含一组测试数据。对于每组测试数据,第一行包括两个正整数N (≤ 50,000), 表示查询总数,和K (≤ 10), 表示这个系统需要展示给用户的最大推荐数量。接着在第二行给定用户访问的条目的编号——为了简化运算,所有条目被编号为从1到N。一行内所有数字之间用空格隔开。

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.

翻译:对于每组测试数据,用户依次进行查询。按照以下格式输出一行每个查询的推荐:
query: rec[1] rec[2] … rec[K]
query表示用户正在访问的条目, rec[i] (i=1, … K) 表示第i个系统推荐给用户的条目。前K个访问最频繁的条目将按照它们的频率降序输出。如果频率相同,那么条目将按照它们的编号升序排序。
注意:第一项没有输出,因为当时不可能给出任何建议。数据保证至少有一个查询拥有输出。


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


解题思路

这道题用set集合解决。一开始考虑到set不能改变保存的数据,所以决定用几个数组自己搭一个set,但是由于太过繁琐且老是出错,还是选择用set删除之前未更新的数据并塞入更新后的数据的方式解决了。参考博客:PAT - 甲级 - 1129. Recommendation System (25)(STL - set)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<vector>
#include<set> 
#include<algorithm>
#define INF 99999999
using namespace std;
int N,K,T[50010];
struct Node{
	int index,times;
	Node(int i,int t):index(i),times(t){}
	bool operator<(const Node &a)const{
		return times==a.times?index<a.index:times>a.times;
	}
};
set<Node>s;
set<Node>::iterator it;
int main(){
	scanf("%d%d",&N,&K);
	int tmp;
	for(int i=0;i<N;i++){
		scanf("%d",&tmp);
		if(i){
			printf("%d:",tmp);
			int j=0;
			for(it=s.begin();j<K&&it!=s.end();it++){
				printf(" %d",it->index);
				j++;
			}
			printf("\n");
		}
		it=s.find(Node(tmp,T[tmp]));
		if(it!=s.end())s.erase(it);
		T[tmp]++;
		s.insert(Node(tmp,T[tmp]));
	}
	return 0;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值