Nguồn đề bài: http://www.spoj.com/PTIT/problems/P157PROA/
1. Đề bài P157PROA spoj
Để chọn ra con số may mắn của riêng CLB IT – PTIT, chủ nhiệm CLB yêu cầu mỗi thành viên lựa chọn một số nguyên dương bất kỳ trong khoảng từ 1 đến 1000. Sau đó con số nào được chọn bởi nhiều người nhất thì sẽ là số may mắn. Nếu có nhiều con số được chọn nhiều lần như nhau thì sẽ ưu tiên chọn con số nhỏ hơn.
Giả sử số thành viên của CLB cũng không thể quá 1000 người. Hãy giúp CLB chọn ra số may mắn.
Input
Dòng đầu tiên ghi số bộ test (không quá 100). Dòng đầu của mỗi bộ test ghi số N, là tổng số thành viên của CLB.
Tiếp theo là N dòng, mỗi dòng ghi một giá trị được chọn.
Output
Với mỗi bộ test, ghi ra trên một dòng số may mắn tìm được.
Example
Input:
3
3
42
42
19
4
7
99
99
7
5
11
12
13
14
15
Output:
42
7
11
2. Gợi ý P157PROA spoj PTIT
– sắp xếp các số mà thành viên chọn, sau đó đếm số lượng số xuất hiện nhiều nhất.
– Tuy nhiên việc sắp xếp bằng Quicksort nay nổi bọt là không hay bằng đếm phân phối bằng mảng đánh dấu , và đếm phân phối trong bài này sẽ dễ nhất.
3. Code tham khảo P157PROA spoj PTIT
Đếm phân phối + Quicksort
a. Code Đếm phân phối
const fi=''; nmax=1000; type data=longint; var f:text; A:array[0..nmax+1] of data; n,test:data; procedure docfile; var i,j,x,sl:data; begin assign(f,fi); reset(f); readln(f,test); for i:=1 to test do begin fillchar(a,sizeof(a),0); readln(f,n); sl:=0; for j:=1 to n do begin readln(f,x); inc(a[x]); end; for j:=1 to 1000 do if a[sl]<a[j] then sl:=j; writeln(sl); end; close(f); end; begin docfile; end.
b. Code Quicksort
const fi = ''; fo = ''; var n, i, count, d, min, count1, nTest, iTest:longint; a : array[1..1005] of longint; procedure Qsort(x, y : longint); var i,j,t,tam:longint; begin if x >= y then exit; i:=x; j:=y; t:=a[(x+y)div 2]; repeat while a[i]<t do inc(i); while a[j]>t do dec(j); if i<=j then begin tam:=a[i]; a[i]:=a[j]; a[j]:=tam; inc(i); dec(j); end; until i > j; Qsort(x,j); Qsort(i,y); end; begin assign(input,fi);reset(input); assign(output,fo);rewrite(output); readln(nTest); for iTest:=1 to nTEst do begin readln(n); for i:=1 to n do readln(a[i]); qsort(1,n); d:=1; min:=a[1]; count:=0; for i:=1 to n do if a[i]<>a[i+1] then begin if d >count then count:=d; d:=1; end else inc(d); d:=1; for i:=1 to n do if a[i]<>a[i+1] then begin if d = count then begin writeln(a[i]); break; end; d:=1; end else inc(d); end; close(input);close(output); end.