Bài tập Cho dãy số nguyên dương {A} có n phần tử, hãy cho biết số lượng giá trị khác nhau trong dãy và giá trị có số lần lặp nhiều nhất (nếu có nhiều hơn một thì chọn giá trị nhỏ nhất) INP Dòng thứ nhất chứa n ( 5101 n ) Dòng tiếp theo là dãy {A} n phần tử cách nhau ( 1 Ai 510.
Trang 1Lưu ý: Tài liệu chỉ mang tính chất tham khảo, nếu có trường hợp chưa đúng đắn
có thể điều chỉnh, xin cảm ơn.
Tài liệu tham khảo từ Tài liệu giáo khoa tin Chuyên tin quyển 1(Dỗ Đức Đông-Lê Minh Hoàng-Nguyễn Thanh Tùng)
Bài tập: Cho dãy số nguyên dương {A} có n phần tử, hãy cho biết số lượng giá trị
khác nhau trong dãy và giá trị có số lần lặp nhiều nhất (nếu có nhiều hơn một thì chọn giá trị nhỏ nhất).
.INP: -Dòng thứ nhất chứa n. ( 1 n 105)
-Dòng tiếp theo là dãy {A} n phần tử cách nhau ( 1 A[i] 105)
.OUT: -Dòng thứ nhất chứa số lượng giá trị khác nhau.
-Dòng thứ hai chứa giá trị có số lần lặp nhiều nhất.
6
15
6 7 100 2 14 14 7 100 9 4 4 9 2 99 9 8 9
Hướng dẫn tham khảo:
- Dùng mảng đánh dấu {F} :
+Gọi F[t] là số lần lặp của giá trị t, ( F[t] + 1) khi gặp t.
+Ban đầu F[t] = 0 (giá trị t chưa gặp nên = 0).
+Ta duyệt mảng {A}, mổi lần ta có giá trị A[i] thì ta cộng F[A[i]] thêm 1 +Để tính số lượng(dem) giá trị khác nhau da duyệt mảng F, nếu F[t] khác 0 có nghĩa là có giá trị t trong dãy (dem ++).
+Để tìm giá trị có lần lặp max thì ta tìm F[t]max và điều kiện t min.
Code tham khảo:
Const Nmax = 100000;
procedure GTMin();
var i, t, dem, res, dmax:longint;
F:array[1 Nmax] of longint;
begin
for i:= 1 to Nmax do // Ban đầu rỗng
F[i]:= 0;
for i:= 1 to n do // Đánh dấu giá trị a[I] có trong dãy
inc( F[a[i]] );
dem:= 0;// số lượng giá trị khác nhau
res:= 0;// giá trị min có số lần lặp max
dmax:= 0;//số lần lặp max
for t:= 1 to Nmax do
if F[t] <> 0 then //giá trị t có trong dãy lặp F[t] lần
begin
inc(dem);
if dmax < F[t] then
begin
slmax:= F[t];
res:= t;
end;
end;
writeln(sl);
write(res);
end;
Trang 2- Ta sắp xếp dãy {A}, khi đó các giá trị giống đứng cạnh nhau.
Khi đó ta chỉ cần đếm số lượng giống của giá trị A[i] ta nhận được số lần lặp của A[i].
Mỗi lần như thế ta tăng số lượng giá trị khác nhau và so sánh để tìm giá trị có số lần lặp max.
Code tham khảo:
procedure QuickSort(L,H:longint);
var i,j :longint;
x,tmp :longint;
begin
i:=L;
j:=H;
x:=a[(L+H) div 2];
repeat
while a[i]<x do inc(i);
while a[j]>x do dec(j);
if i<=j then
begin
tmp:=a[i];
a[i]:=a[j];
a[j]:=tmp;
inc(i);
dec(j);
end;
until i>j;
if L<j then QuickSort(L,j);
if i<H then QuickSort(i,H);
end;
function countValue():longint;//số lượng giá trị khác nhau var i,count :longint;
begin
count:=1;
for i:=2 to n do
if a[i-1]<>a[i] then inc(count);
countValue := count;
end;
function highestFrequency():longint;//giá trị có số lần lặp max var i,count,rslt, res :longint;
Begin
rslt:=1;
count:=1;
res := 1;
for i:=2 to n do
begin
if a[i] <> a[i-1] then count:=1
else inc(count);
if count>rslt then
begin
rslt:=count;
res := a[i-1];
end;
end;
highestFrequency := res;
end;