PAT甲级 1129 Recommendation System (25分) set/C++

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:

  1. 使用set存放,实现自动排序;
  2. set中存放结构体,通过访问次数排序,如果访问次数相等,则根据item序号大小排序;(通过重载 operator <实现)
  3. 每一次输入更新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会报错
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值