1129 Recommendation System (25分)
题目大意:给出用户访问item顺序的序列,要求在用户访问过程中给用户推荐前面访问次数最多的item。
(做题的时候,看了翻译也没理解什么意思,我这理解能力,哭QWQ)
输入: indices为用户访问顺序
12 3
3 5 7 5 5 3 2 1 8 3 8 12
表示第一次用户访问序号为3的item,第二次用户访问序号为5的item…
输出: 当前访问item: 系统推荐的<=3个
item
tips:
- 使用set存放,实现自动排序;
- set中存放结构体,通过访问次数排序,如果访问次数相等,则根据item序号大小排序;(通过
重载 operator <
实现) - 每一次输入更新set。
#include<iostream> //输入输出流头文件
#include<set> //set集合
using namespace std; //标准命名空间
typedef struct cn{
int num,rec;
cn(int num,int rec):num(num),rec(rec){}
bool operator < (const cn &a) const {
return (num != a.num) ? num > a.num: rec < a.rec;
}
};
int n,k;
int main(){ //主函数
#ifdef ONLINE_JUDGE //如果有oj系统(在线判定),则忽略文件读入,否则使用文件作为标准输入
#else
freopen("1.txt", "r", stdin); //从1.txt输入数据
#endif
cin>>n>>k; set<cn> s;
int *click=new int[n+1];
fill(click,click+n+1,0);
for(int i=0;i<n;i++){
int x;
cin>>x;
cn item(click[x],x);
if(i>0){
cout<<x<<": ";
set<cn>::iterator iter=s.begin();
for(int j=0;j<k&&iter!=s.end();iter++,j++){//j用于记录当前输出个数
cout<<iter->rec;
if(j==s.size()-1||j==k-1)cout<<endl;//s结尾以及输出三个
else cout<<' ';
}
}
if(s.find(item)!=s.end()) s.erase(item);//更新set(删去原来的)
s.insert(cn(++click[x],x));
}
return 0; //返回0,如果不返回0,PAT会报错
}