A1129 Recommendation System

这个题目我感觉我想到了一个大部分人都没想到的方法,很开心。
题目要求是输入n个数,在输入第i个数的时候输出前面出现频率最大的前k个数。

这个题目一开始用sort排序,有两个点怎么写都超时,后来看了一些网上的解答,都用了set内部排序,需要重载<。
在我快要放弃的时候,再看一遍题目,发现了一个点,题目说K<=10,这个就很关键了,说明我可以用sort,但是可以大大降低sort的元素个数由于每次对一个新的a[i],都要排序,实际上做了大量无意义的排序,前一轮的结果是可以继续用的,那么在我代码里面的数组v的size小于k的时候尽管push,但是如果要放第k+1个了,sort以后把尾元素pop掉,这样一来,每轮sort需要排序的元素都不超过k+1个,大大节省了时间。
这个方法很取巧,如果k很大可能就不适用了,但是依然很开心我想到了这点。

#include <stdio.h>
#include <string.h>
#include <algorithm> 
#include <vector>
using namespace std;

vector<int> v;
const int maxn = 50010;
int a[maxn];	//存放序列
int cnt[maxn];	//记录每个元素出现次数
bool flag[maxn]
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值