标签:
题目大致翻译:莫斯科现在要举行一次来自不同国家科学家参加的大会,每个科学家都有各自的语音,用1到10^9的整数表示。会议晚上所有科学家去看电影,每部电影的声音和字幕是两种不同的语言,如果一个科学家看到电影声音是自己的语言,他就会很高兴,如果一个科学家看到电影字幕是自己的语言,他也会满意。现在给出所有科学家的语言、电影的声音和字幕语言,选择一部电影在让高兴的科学家最多的同时满意的科学家也最多。
讲实话这是我第一次认真写哈希,以前基本没怎么做过这方面的题【喂喂喂就是完全不会吧】
都怪我英语不好一开始题目意思看错了调了半天……
这一题看起来是一道水题,实际上确实是一道水题。实际上我觉得只用一个哈希就可以了,或者无聊一点,写一个平衡树都可以。
用哈希的话,虽然正常来讲是常数级别,但是万一hash函数设计的不好冲突太多处理起来也是很耗时间的。用平衡树的话……太大材小用了,最主要我也写的不熟……
所以说我用的方法是哈希+二叉排序树,就是说哈希表里每一个位置对应的实际上不是一个值而是一颗二叉排序树,相同关键字直接往树里面加。这样写解决冲突方面效率肯定要比一般的哈希要高得多,而且与平衡树相比简直超级好写,用一般的数组或者是指针实现都可以。
因为这一题一看就是个水所以说用的二叉排序树就可以解决问题,而如果数据再坑爹一点就可以在哈希表里套一个平衡树,这样效率绝对高……
至于哈希函数我也只是简单地用了mod,再一次验证这是个水题
【昨天做了ctsc2012企鹅QQ我也是这么做的然而超时了……我同样用的哈希表里套个二叉排序树,基友写的splay,都超时了……果然ctsc的题没那么简单,下次在哈希里套个treap】
1 program j01; 2 type xx=record l,r,num:longint; da:longint; end; 3 var tr:array[1..200000]of xx; 4 ha:array[0..200000]of longint; 5 ans:array[1..2,1..200000]of longint; 6 n,max,maxn,max1,m,x,t,i,k:longint; 7 function hash(i:longint):longint; 8 begin 9 hash:=i mod 200000; 10 end; 11 12 procedure insert(var i:longint;x:longint);{二叉排序树插入} 13 begin 14 if i=0 then 15 begin 16 inc(t); 17 i:=t; 18 with tr[t] do 19 begin 20 da:=x; 21 l:=0; 22 r:=0; 23 num:=1; 24 end; 25 exit; 26 end; 27 with tr[i] do 28 begin 29 if da=x then 30 begin 31 inc(num); 32 exit; 33 end; 34 if da>x then insert(l,x); 35 if da<x then insert(r,x); 36 end; 37 end; 38 39 procedure find(i,x,j,k:longint);{二叉排序树查找} 40 begin 41 if i=0 then exit; 42 with tr[i] do 43 begin 44 if da=x then 45 begin 46 inc(ans[k,j],num); 47 exit; 48 end; 49 if da>x then find(l,x,j,k); 50 if da<x then find(r,x,j,k); 51 end; 52 end; 53 54 begin 55 readln(n); 56 fillchar(ha,sizeof(ha),0); 57 t:=0; 58 for i:=1 to n do 59 begin 60 read(x); 61 insert(ha[hash(x)],x); 62 end; 63 readln(m); 64 fillchar(ans,sizeof(ans),0); 65 for k:=1 to 2 do 66 for i:=1 to m do 67 begin 68 read(x); 69 find(ha[hash(x)],x,i,k); 70 end; 71 max:=ans[1,1]; 72 max1:=ans[2,1]; 73 maxn:=1; 74 for i:=2 to m do 75 begin 76 if (ans[1,i]>max)or((ans[1,i]=max)and(ans[2,i]>max1)) then 77 begin 78 max:=ans[1,i]; 79 max1:=ans[2,i]; 80 maxn:=i; 81 end; 82 end; 83 writeln(maxn); 84 end.
标签:
原文地址:http://www.cnblogs.com/oldjang/p/5493180.html