11073 最热门的K个搜索串
时间限制:350MS 内存限制:65535K 提交次数:0 通过次数:0
语言: not limited
描述
大家都非常喜欢而习惯用baidu,google,sogou等搜索引擎来搜索自己感兴趣的资料。
搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。
假设目前有一百万个记录(这些查询串的重复度比较高,除去重复后会少很多)。
搜索引擎统计查询串的重复频度,一个查询串的重复频度越高,说明查询它的用户越多,也就是越热门。
希望能找到最热门的10个或100个查询串。
现在问题模型是:一个无序的整数数列,数列元素个数为N,1000<=N<=1000000,
如何选出其中最大的K个数,K远小于N(K<<N, K<1000),
比如Top10的数,或Top100的数等。本意并不要求选出的这K个数有序,也不要求剩余的N-K个数有序。
但最终输出为便于评判,还是要求排序的,具体看如下说明(3)。
说明:
(1)虽然此题N较大,还是可以一次性将整数数列导入内存的。
(2)此题认为N较大,不适合对所有元素排序后取得“最大的K个数”,
此排序法复杂度O(NlogN),请你勿用此法,否则将判超时。请选用低于O(NlogN)阶的算法来做。
(3)此题原本是不要求选出的K个数有序,但为了在本OJ(Oline Judge)系统上便于评判,
还是请您排一下序吧,从大至小的不增顺序,因为K远小于N,对K个数排序代价O(KlogK)对N来说可以忽略。
11
输入格式
输入:两行,第一行N和K,第二行为N个无序整数
输出格式
输出:这N个无序整数的最大的K个数
输入样例
20 6
9 1 2 5 3 2 3 4 10 7 1 5 7 6 4 8 9 6 7 5
输出样例
10 9 9 8 7 7
时间限制:350MS 内存限制:65535K 提交次数:0 通过次数:0
语言: not limited
描述
大家都非常喜欢而习惯用baidu,google,sogou等搜索引擎来搜索自己感兴趣的资料。
搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。
假设目前有一百万个记录(这些查询串的重复度比较高,除去重复后会少很多)。
搜索引擎统计查询串的重复频度,一个查询串的重复频度越高,说明查询它的用户越多,也就是越热门。
希望能找到最热门的10个或100个查询串。
现在问题模型是:一个无序的整数数列,数列元素个数为N,1000<=N<=1000000,
如何选出其中最大的K个数,K远小于N(K<<N, K<1000),
比如Top10的数,或Top100的数等。本意并不要求选出的这K个数有序,也不要求剩余的N-K个数有序。
但最终输出为便于评判,还是要求排序的,具体看如下说明(3)。
说明:
(1)虽然此题N较大,还是可以一次性将整数数列导入内存的。
(2)此题认为N较大,不适合对所有元素排序后取得“最大的K个数”,
此排序法复杂度O(NlogN),请你勿用此法,否则将判超时。请选用低于O(NlogN)阶的算法来做。
(3)此题原本是不要求选出的K个数有序,但为了在本OJ(Oline Judge)系统上便于评判,
还是请您排一下序吧,从大至小的不增顺序,因为K远小于N,对K个数排序代价O(KlogK)对N来说可以忽略。
11
输入格式
输入:两行,第一行N和K,第二行为N个无序整数
输出格式
输出:这N个无序整数的最大的K个数
输入样例
20 6
9 1 2 5 3 2 3 4 10 7 1 5 7 6 4 8 9 6 7 5
输出样例
10 9 9 8 7 7
12
---------------------------------------------------
11073 最热门的K个搜索串 (递归、分治)
�������
#include<stdio.h>
#include"malloc.h"
int main()
{
int n,k,i,j,temp,*p;
scanf("%d%d",&n,&k);
p=(int*)malloc(n*sizeof(int));
for(i=0;i<n;i++)
{
scanf("%d",p+i);
}
for(j=0;j<k;j++)
for(i=j+1;i<n;i++)
{
if(p[i]>p[j])
{temp=p[j]; p[j]=p[i]; p[i]=temp;}
}
for(i=0;i<k;i++)
{
printf("%d ",p[i]);
}
printf("\n");
return 0;
}