CF 159 A [没啥,只是想记录一下自己想的贪心是错的]

orz。如此一个水题让我想了很久用了无数STL之后已然WA到死。直到想明白自己哪里错了。
哎,自己的贪心果断不靠谱啊。但是为啥他们那些如此暴力的做法都能过呢- -构造卡N^3的数据太难了是么。。

题目大意:
n(int,[1,1000]), d(int,[1,1000])
n条记录,每条记录有a,b(string,len[1,20]),t(int,[0,10000])。按非降序列给出。
a,b,t表示在t时刻,a给b发了一条信息。
约束条件,如果a给b在t1时刻发了信息,且b给a在t2时刻发了信息,且0 < t2 - t1 <= d。那么a和b就是朋友关系。
(不存在自己给自己发消息的情况)

让你给出朋友关系的条数,和每条朋友关系,spj。

我的做法:
错误做法,N*logN的贪心:
逐条读入,用string存unique的string,map存映射。用int[][]存发送时间,abt则rel[index(a)][index(b)] = max(t, rel[index(a)][index(b)]。并与rel[index(b)][index(a)]比较,如果满足约束条件则将(a,b)插入一个set中。
错误关键点:在线更新rel[][]是不对的,虽说两个人的朋友关系与否只和最近一次的两人互通消息有关,但是这中间存在一个反例(由于题目条件的特殊性):
a b 1
a b 2
b a 2
这组例子a、b是朋友关系。但是由于rel[index(a)][index(b)] = 2 其矩阵对称值也为2,所以不满足约束关系,所以就判错了。
所以一个简单的正确做法为离线做。
正确做法,N^2*logN的枚举:
对于每条记录枚举之前所有记录,看满足约束条件否,满足则扔set。。
(ps,有人用vector代替set都不超时。。。N^3啊,泪目)
(贪心什么的,一证明,二想反例,一定要慎重啊。自己还是太弱了。

太伤了。。。

posted on 2012-03-27 13:12 BUPT-[aswmtjdsj] @ Penalty 阅读(294) 评论(0)  编辑 收藏 引用 所属分类: 教训


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2012年3月>
26272829123
45678910
11121314151617
18192021222324
25262728293031
1234567

导航

统计

常用链接

留言簿(1)

随笔分类(150)

随笔档案(71)

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜