CODEVS1533 互斥的数(哈希表)

  给定一个集合,要求一个最大子集,满足两两之间不互斥。对两个数x,y互斥的定义是,y=p*x。

  先对集合中的数从小到大排序后线性扫,若一个数x可以取则取,取完之后p*x这个数不可取。由于数字较大,使用哈希表来判断。

  

 1 Program CODEVS1533;
 2 const maxn=1000007;
 3 var a,f:array[0..maxn] of longint;
 4     num,m,n,i,j,k,x,y,z:longint;
 5  procedure sort(l,r: longint);
 6       var
 7          i,j,x,y: longint;
 8       begin
 9          i:=l;
10          j:=r;
11          x:=a[(l+r) div 2];
12          repeat
13            while a[i]<x do
14             inc(i);
15            while x<a[j] do
16             dec(j);
17            if not(i>j) then
18              begin
19                 y:=a[i];
20                 a[i]:=a[j];
21                 a[j]:=y;
22                 inc(i);
23                 j:=j-1;
24              end;
25          until i>j;
26          if l<j then
27            sort(l,j);
28          if i<r then
29            sort(i,r);
30       end;
31 procedure insert(x:longint);
32 var h:longint;
33 begin
34   h:=x mod maxn;
35   while (f[h]<>0) and (f[h]<>x) do
36     h:=(h+1) mod maxn;
37   f[h]:=x;
38 end;
39 function find(x:longint):boolean;
40 var h:longint;
41 begin
42   h:=x mod maxn;
43   while (f[h]<>0) and (f[h]<>x) do
44     h:=(h+1) mod maxn;
45   if f[h]=0 then exit(false) else exit(true);
46 end;
47 begin
48   readln(n,m);
49   for i:=1 to n do read(a[i]);
50   sort(1,n);
51   num:=0;
52   for i:=1 to n do
53     begin
54       if find(a[i]) then continue;
55       inc(num);
56       insert(a[i]*m);
57     end;
58   writeln(num);
59 end.

 

posted @ 2014-12-04 19:31  rpSebastian  阅读(200)  评论(0编辑  收藏  举报