统计数字 NDK1498 题解

    技术2022-05-19  19

    PS:BST经典老题

     

    program NDK1600; type tree=^node;//定义tree为指向node的一个类型 node=record data,time:longint;//data代表当前数据,time代表统计次数 l,r:tree;//左右孩子 end; var n:longint; t:tree; procedure insert(data:longint;var tre:tree); begin //根据BST的性质,左子树<根<右子树,当tree指向空时,新开一个域记录待插入的数据和次数 if tre=nil then begin new(tre); tre^.l:=nil; tre^.r:=nil; tre^.data:=data; tre^.time:=1; exit; end; if tre^.data=data then//如果恰巧碰到等于的,那么就增加次数 begin inc(tre^.time); exit; end; if data<tre^.data then insert(data,tre^.l) else insert(data,tre^.r);//小于在左边插入,大于在右边插入 end; procedure init; var n,x,i:longint; begin readln(n); for i:=1 to n do begin readln(x); insert(x,t); end; end; procedure zx(var tre:tree); begin //中序遍历满足从小到大的性质,因此把BST中序遍历一遍就可以满足题目要求 if tre=nil then exit else begin zx(tre^.l); writeln(tre^.data,' ',tre^.time); zx(tre^.r); end; end; begin assign(input,'NDK1498.in'); reset(input); assign(output,'NDK1498.out'); rewrite(output); init; zx(t); close(input); close(output); end.

     

    另外一种方法,则是采用离散化的方法。

    program A1498; type zs=record data:longint; cs:longint; end; var m,n,tot:longint; b:array[-1..200001]of zs; a:array[-1..200001]of longint; procedure init; var i:longint; begin readln(n); for i:=1 to n do read(a[i]); end; procedure qsort(l,r:longint); var i,j,m,t:longint; begin i:=l; j:=r; m:=a[(l+r) shr 1]; repeat while a[i]<m do inc(i); while a[j]>m do dec(j); if i<=j then begin t:=a[i]; a[i]:=a[j]; a[j]:=t; inc(i); dec(j); end; until i>j; if i<r then qsort(i,r); if l<j then qsort(l,j); end; procedure main; var i:longint; begin b[1].data:=a[1]; b[1].cs:=1; tot:=1; for i:=2 to n do begin if a[i]<>a[i-1] then begin inc(tot); b[tot].data:=a[i]; b[tot].cs:=1; end else begin inc(b[tot].cs); end; end; end; procedure print; var i:longint; begin for i:=1 to tot do writeln(b[i].data,' ',b[i].cs); end; begin init; qsort(1,n); main; print; end.


    最新回复(0)