【请教】《编程之美》发帖水王问题的拓展

iloveyaoge 2010-08-21 10:15:02
原题目如下:
一个论坛中又一大“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。该“水王”发帖数目超过了总数的一半。如果你又一个当前论坛所有帖子(包括回帖)的列表,其中帖子作者的ID也在表中,你能快速找出这个传说中的水王吗?

拓展题:

随着Tango的发展,管理员发现,“超级水王”没有了。统计结果表明,有3个发帖很多的ID,他们的发帖数目都超过了帖子总数目N的1/4。你能从发帖ID列表中快速找出他们的ID吗?



我的问题:

如果没有1/4这个条件,只要求我们找出发帖量最多的三个人呢?

求帮助~
...全文
451 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2010-08-21
  • 打赏
  • 举报
回复

template<class _RanIt,
class _Ty,
class _Pr> inline
void _Partial_sort(_RanIt _First, _RanIt _Mid, _RanIt _Last,
_Pr _Pred, _Ty *)
{ // order [First, _Last) up to _Mid, using _Pred
_DEBUG_RANGE(_First, _Mid);
_DEBUG_RANGE(_Mid, _Last);
_DEBUG_POINTER(_Pred);
_STD make_heap(_First, _Mid, _Pred);
for (_RanIt _Next = _Mid; _Next < _Last; ++_Next) if (_DEBUG_LT_PRED(_Pred, *_Next, *_First)) { // replace top with new largest
_Ty _Val = _Move(*_Next);
_Pop_heap(_First, _Mid, _Next, _Move(_Val), _Pred,
_Dist_type(_First));
}
_STD sort_heap(_First, _Mid, _Pred);
}

qq120848369 2010-08-21
  • 打赏
  • 举报
回复

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;

const int testData[]={1,2,3,4,5,6,5,4,3,2,1,9,8,7,6,5,4,3,2,1,2,3,4,5,6,7,8,9,0};

struct printTop3
{
void operator()(const int &d)
{
cout<<d<<" ";
}
};

int main()
{
vector<int> testVec(testData,testData+29);
partial_sort(testVec.begin(),testVec.begin()+3,testVec.end(),greater<int>());
for_each(testVec.begin(),testVec.begin()+3,printTop3());
return 0;
}

pro_To_Life 2010-08-21
  • 打赏
  • 举报
回复
恩,我的错,没有看最下面,不好意思,再思考一下
iloveyaoge 2010-08-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 pro_to_life 的回复:]
引用 6 楼 iloveyaoge 的回复:
楼上的方法没错,可要是记录特别多呢?
像圣战那天,一天发了那么多帖子,全都存起来的话....
我只要前十啊,每个都算...
不管你选前多少,方法是一定的,都能够做到。但是对于那种直接统计的方法,要更多的空间和时间
[/Quote]
嗯,就是越优化越好啊,我比较弱~
你说具体一点嘛
iloveyaoge 2010-08-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 qq120848369 的回复:]
如果事前你需要自行统计ID发帖数的话肯定会用到hash_map或者map之类的数据结构,条件允许用数据库.
[/Quote]
我问过牛人,我说的用map,然后他叫我再优化一下。
是不是用hash?
或者有更好的数据结构?
pro_To_Life 2010-08-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 iloveyaoge 的回复:]
楼上的方法没错,可要是记录特别多呢?
像圣战那天,一天发了那么多帖子,全都存起来的话....
我只要前十啊,每个都算...
[/Quote]不管你选前多少,方法是一定的,都能够做到。但是对于那种直接统计的方法,要更多的空间和时间
iloveyaoge 2010-08-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 qq120848369 的回复:]
STL里的partial_sort可以帮你完成你的问题.

原理就是用最小堆,建一个大小3的堆,然后依次读取每条发帖纪录,如果数量超过堆顶就替换掉堆顶,维护一次堆.

最终堆中3个人就是最水的.
[/Quote]
请问这个和直接用数组比,不可或缺的优点在哪里?
yzx714 2010-08-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 iloveyaoge 的回复:]

引用 4 楼 yzx714 的回复:
额,遍历这个表,按ID列入一个关联数组,ID名作为key,value每次读到这个ID,value就+1,然后把value读出来,排序……

楼上的方法没错,可要是记录特别多呢?
像圣战那天,一天发了那么多帖子,全都存起来的话....
我只要前十啊,每个都算...
[/Quote]那就让百度回档,帖子就少了~
qq120848369 2010-08-21
  • 打赏
  • 举报
回复
如果事前你需要自行统计ID发帖数的话肯定会用到hash_map或者map之类的数据结构,条件允许用数据库.
iloveyaoge 2010-08-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yzx714 的回复:]
额,遍历这个表,按ID列入一个关联数组,ID名作为key,value每次读到这个ID,value就+1,然后把value读出来,排序……
[/Quote]
楼上的方法没错,可要是记录特别多呢?
像圣战那天,一天发了那么多帖子,全都存起来的话....
我只要前十啊,每个都算...
qq120848369 2010-08-21
  • 打赏
  • 举报
回复
STL里的partial_sort可以帮你完成你的问题.

原理就是用最小堆,建一个大小3的堆,然后依次读取每条发帖纪录,如果数量超过堆顶就替换掉堆顶,维护一次堆.

最终堆中3个人就是最水的.
iloveyaoge 2010-08-21
  • 打赏
  • 举报
回复
楼上的方法没错,可要是记录特别多呢?
像圣战那天,一天发了那么多帖子,全都存起来的话....
我只要前十啊,每个都算...
pro_To_Life 2010-08-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yzx714 的回复:]

额,遍历这个表,按ID列入一个关联数组,ID名作为key,value每次读到这个ID,value就+1,然后把value读出来,排序……
[/Quote]时间复杂度较高,每次删除4个不同的id,直到最后不能删除为止,一定能够剩下3个不同的满足条件的id,有最低的时间复杂度
yzx714 2010-08-21
  • 打赏
  • 举报
回复
额,遍历这个表,按ID列入一个关联数组,ID名作为key,value每次读到这个ID,value就+1,然后把value读出来,排序……
iloveyaoge 2010-08-21
  • 打赏
  • 举报
回复
不是简单的排序啊!!!如果就是排序那还有编程的美啊。
1. id列表是有重复的
2. 没有了1/4这个条件了
这俩点很重要的,要求这俩点之后和以前就是完全不一样的题了。
pro_To_Life 2010-08-21
  • 打赏
  • 举报
回复
每次删除4个不同的id,直到最后不能删除为止,一定能够剩下3个不同的满足条件的id
RLib 2010-08-21
  • 打赏
  • 举报
回复
原来是排序
iloveyaoge 2010-08-21
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 pro_to_life 的回复:]
引用 23 楼 iloveyaoge 的回复:

引用 20 楼 pro_to_life 的回复:
和编程之美第一个题的代码原理是一样的,代码你看过了吧
例如:1 1 1
2 2 2
3 3 3
5 7
这个例子,你对着代码看看

不是真删,程序的巧妙之处是最终留下的三个一定是有1/4的以上的
最终结果保存在candidate的数组的三个元素里面

你想想这个例子:
1……
[/Quote]
我知道书上的意思
可我把他的题给改了啊!!
董小尾 2010-08-21
  • 打赏
  • 举报
回复
编程之美!

学习了
pro_To_Life 2010-08-21
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 iloveyaoge 的回复:]

引用 20 楼 pro_to_life 的回复:
和编程之美第一个题的代码原理是一样的,代码你看过了吧
例如:1 1 1
2 2 2
3 3 3
5 7
这个例子,你对着代码看看

不是真删,程序的巧妙之处是最终留下的三个一定是有1/4的以上的
最终结果保存在candidate的数组的三个元素里面

你想想这个例子:
1 1
2 2
3 3
4,5,6,7,8,9,……
[/Quote]
我觉得你没有深入的理解编程之美的题意,你给的这个例子没有存在三个发帖量大于1/4的id,你举出一个存在三个发帖量大于1/4的id的情况,最终结果肯定能保留这三个id.这是一个数学规律的问题
加载更多回复(7)
全新特点(详情可以见论坛演示)
全面美化的论坛界面,强大的个人信箱中心;
实用但不豪华的插件,新增的后台管理功能;

1、面版与展区的全面综合:采用功能分类,个性化面版和展区,头部导航分类。

面版说明:
我的信箱
我的资料
我的权限
修改资料
修改密码
自定风格
发表帖子
参与帖子
显示设置

展区说明:
用户列表
管理团队
斑竹评定
版面帖数
积分排行
热帖排行
今日新帖
论坛精华
图片展区
文件展区
闪客展区


2、增加了多种风格。

3、增加模式选择:
简洁模式
标准模式
我的模式

4、全新个人信箱:写信息,发件箱,收件箱,清空发件箱,清空收件箱
5、更新了界面:上部导航美化,左栏美化,QQ等级图片,全新头像, 联盟logo控制了大小 6、增强的后台功能:显示已有版主,用户列表(点击可直接修改资料),空间详细统计,工资发放 7、扩大缩小发贴编辑区,快捷回复中的发贴表情和高级回复功能 8、首页今日新帖与本周热帖显示. 9、加入论坛奖章,自助联盟,流量统计,底部音乐播放器(管理密码:tz-sky) 10、后台控制登陆注册验证玛和开放注册功能,可以自由控制是否需要验证码及论坛是否开放注册 11、首页增加版面在线人数显示,新信息真人留言语音提醒。 12、新的在线统计文件,可以直接点注册会员查看会员资料 13、后台可以选择分类状态:0为默认方式,1为简便方式,2为隐藏方式 14、最新漏洞补丁都已经打上,请大家放心使用! 注:论坛管理默认用户名:admin 密码:admin

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧