博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~
http://www.cnblogs.com/chenxiwenruo/p/6789819.html
特别不喜欢那些随便转载别人的原创文章又不给出链接的
所以不准偷偷复制博主的博客噢~~

题意:用户每次选择一个indice,输出之前出现的频率最高的k个indice
如果恰好有两个频率一样,输出indice较小的那个

显然不能每次都要对当前所有的item排个序,会超时的
由于每次只要给出前k个出现频率最高的,如果出现频率一样,则给出值最小的
所以只要能存储前k个item的出现频率和值就行

用户每查询一个indice,先对当前的recommend进行排序,输出k个,不足k个的有多少输出多少,然后进行更新操作。
如果indice在当前的recommend里,那么只要更新下频率即可
如果不在的话,那么就要分情况了
如果当前recommend不足k个,那么往后添加一个新的即可
如果当前recomend已经有k个,只要将新的indice与最后一个进行比较与替换即可

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn=+;
int cnt[maxn];
int n,k; struct Node{
int indice;
int cnt;
bool operator<(const Node tmp)const{
if(cnt==tmp.cnt){
return indice<tmp.indice;
}
else{
return cnt>tmp.cnt;
}
}
}recommend[+];
int main()
{
int indice;
int len;
Node node;
memset(cnt,,sizeof(cnt));
scanf("%d %d",&n,&k);
if(n>=){
scanf("%d",&indice);
cnt[indice]++;
node.cnt=cnt[indice];
node.indice=indice;
recommend[]=node;
len=;
}
for(int i=;i<n;i++){
scanf("%d",&indice);
printf("%d:",indice);
//当len<k的时候,若没在len个里面出现过,往recommend数组后面添就行
if(len<k){
sort(recommend,recommend+len);
bool isExist=false;
int idx;
for(int j=;j<len;j++){
printf(" %d",recommend[j].indice);
if(recommend[j].indice==indice){
isExist=true;
recommend[j].cnt++;
cnt[indice]++;
}
}
if(!isExist){
recommend[len].indice=indice;
recommend[len].cnt=cnt[indice]=;
len++;
}
}
//如果recommend已经有k个了,那么如果在这k个里面没出现过,当前的就得和第k个比较了
else{
sort(recommend,recommend+k);
bool isExist=false;
int idx;
for(int j=;j<k;j++){
printf(" %d",recommend[j].indice);
if(recommend[j].indice==indice){
isExist=true;
recommend[j].cnt++;
cnt[indice]++;
}
}
if(!isExist){
cnt[indice]++;
if(cnt[indice]>recommend[k-].cnt ||(cnt[indice]==recommend[k-].cnt && indice<recommend[k-].indice)){
recommend[k-].cnt=cnt[indice];
recommend[k-].indice=indice;
}
}
}
printf("\n");
}
return ;
}

PAT甲题题解-1129. Recommendation System (25)-排序的更多相关文章

  1. PAT甲题题解-1051. Pop Sequence (25)-堆栈

    将1~n压入最多为m元素的栈 给出k个出栈序列,问你是否能够实现. 能输出YES 否则NO 模拟一遍即可,水题. #include <iostream> #include <cstd ...

  2. PAT甲题题解-1059. Prime Factors (25)-素数筛选法

    用素数筛选法即可. 范围long int,其实大小范围和int一样,一开始以为是指long long,想这就麻烦了该怎么弄. 而现在其实就是int的范围,那难度档次就不一样了,瞬间变成水题一枚,因为i ...

  3. PAT甲题题解-1101. Quick Sort (25)-大水题

    快速排序有一个特点,就是在排序过程中,我们会从序列找一个pivot,它前面的都小于它,它后面的都大于它.题目给你n个数的序列,让你找出适合这个序列的pivot有多少个并且输出来. 大水题,正循环和倒着 ...

  4. PAT甲题题解-1117. Eddington Number(25)-(大么个大水题~)

    如题,大水题...贴个代码完事,就这么任性~~ #include <iostream> #include <cstdio> #include <algorithm> ...

  5. PAT甲题题解-1130. Infix Expression (25)-中序遍历

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789828.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  6. PAT甲题题解-1016. Phone Bills (25)-模拟、排序

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789229.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  7. PAT甲题题解-1021. Deepest Root (25)-dfs+并查集

    dfs求最大层数并查集求连通个数 #include <iostream> #include <cstdio> #include <algorithm> #inclu ...

  8. PAT甲题题解-1024. Palindromic Number (25)-大数运算

    大数据加法给一个数num和最大迭代数k每次num=num+num的倒序,判断此时的num是否是回文数字,是则输出此时的数字和迭代次数如果k次结束还没找到回文数字,输出此时的数字和k 如果num一开始是 ...

  9. PAT甲题题解-1028. List Sorting (25)-水排序

    #include <iostream> #include <cstdio> #include <algorithm> #include <string.h&g ...

随机推荐

  1. Stanford机器学习---第十一讲.异常检测

    之前一直在看Standford公开课machine learning中Andrew老师的视频讲解https://class.coursera.org/ml/class/index 同时配合csdn知名 ...

  2. PJ初赛复习日记

    PA姑娘的PJ初赛复习日记 by Pleiades_Antares PJ初赛考试马上就要开始了(今年应该是10.13吧?),作为蒟蒻的我们怎么能不复习呢? 众所周知,复习方法有很多很多种-- 比如 ( ...

  3. [java大数据面试] 2018年4月百度面试经过+三面算法题:给定一个数组,求和为定值的所有组合.

    给定一个数组,求和为定值的所有组合, 这道算法题在leetcode应该算是中等偏下难度, 对三到五年工作经验主要做业务开发的同学来说, 一般较难的也就是这种程度了. 简述经过: 不算hr面,总计四面, ...

  4. Ceph基础知识和基础架构认识

    1  Ceph基础介绍 Ceph是一个可靠地.自动重均衡.自动恢复的分布式存储系统,根据场景划分可以将Ceph分为三大块,分别是对象存储.块设备存储和文件系统服务.在虚拟化领域里,比较常用到的是Cep ...

  5. [题目] luogu P2061 [USACO07OPEN]城市的地平线City Horizon

    算法 线段树 + 离散化 思路 对\((x,y,h)\)的左右端点\(x,y\)进行离散化,离散化前的原值记为\(val[i]\),对每个矩形按高度\(h\)从小到大排序. 设离散化后的端点有\(M\ ...

  6. 离线安装Cloudera Manager 5和CDH5(最新版5.9.3) 完全教程(五)数据库安装(双节点)

    一.方案选择 通过Lvs+keepalived+mysql(主主同步)实现数据库层面的高可用方案,需要两台服务器作为数据库提供业务数据的存储,应用服务器通过vip访问数据库,允许同一时间内一台数据库服 ...

  7. Ros使用Arduino 1安装Arduino IDE

    安装Arsuino IDE sudo apt-get install arduino 设置库文件路径 在使用ROS的库文件时,必须在代码的开头包括: #include <ros.h> 接下 ...

  8. Linux系统--命令行安装weblogic10.3.6

    Linux下命令行安装weblogic10.3.6 一.安装前准备工作: 1.创建用户useradd weblogic;创建用户成功linux系统会自动创建一个和用户名相同的分组,并将该用户分到改组中 ...

  9. 遇到的web请求错误码集合与解释

    302 临时移动.与301类似.但资源只是临时被移动.客户端应继续使用原有URI

  10. Java基础之多线程篇(线程创建与终止、互斥、通信、本地变量)

    线程创建与终止 线程创建 Thread类与Runnable接口的关系 public interface Runnable { public abstract void run(); } public ...