Nguồn đề bài: http://www.spoj.com/PTIT/problems/P153PROF/
1. Đề bài P153PROF PTIT spoj
Có một cuộc quyết chiến giữa 2 phe Radiant và Dire. Mỗi phe có N chiến binh, mỗi chiến binh đều biết chỉ số sức mạnh của mình. Cuộc quyết chiến giữa 2 phe phải được tuân thủ luật sau:
Có N vòng đấu, mỗi vòng đấu Radiant và Dire cử ra 1 chiến binh để quyết chiến với bên kia. Chiến binh của bên nào thắng thì bên đó sẽ được 1 điểm, bên thua cuộc được 0 điểm.
Trước khi cuộc quyết chiến diễn ra, thủ lĩnh của cả 2 phe đều biết được thực lực các chiến binh của đối phương. Thủ lĩnh Dire là 1 người tài trí hơn người, ông ta biết cách sắp xếp thứ tự thi đấu sao cho bên mình có thể đạt được nhiều điểm nhất có thể.
Bạn hãy đoán xem với danh sách 2 đội đã cho trước, Dire có thể có tối đa bao nhiêu điểm.
Input
Dòng đầu tiên chứa số N (1 ≤ n ≤ 2*105).
Dòng thứ 2 gồm n số nguyên dương a[1], a[2], …, a[n] là chỉ số sức mạnh của các chiến binh phe Radiant.
Dòng thứ 3 gồm n số nguyên dương b[1], b[2], …, b[n] là chỉ số sức mạnh của các chiến binh phe Dire.
(1 ≤ ai, bi ≤ 2*N).
Giả sử rằng chỉ số sức mạnh của tất cả các chiến binh 2 phe đều khác nhau.
Output
In ra số điểm tối đa Dire có thể đạt được.
Example
Test 1:
Input:
3
3 4 5
1 2 6
Output:
1
Test 2:
Input:
4
4 5 6 2
1 7 3 8
Output:
3
2. Hướng dẫn P153PROF PTIT spoj
-Sắp xếp mảng A, B tăng dần.
– sử dụng 2 biến i (đại diện cho A) và j (đại diện cho B) để duyệt:
– nếu Sức mạnh A[i]<B[j] thì kết quả được thêm 1, ngược lại tức là SM của A[i]>B[j] thì ta cần chọn 1 B[j] khác sao cho lớn hơn A[i], như vậy ta sẽ duyệt chọn j+1 tiếp theo.
– Dừng khi (i=n) hoặc (j=n)
* Dùng Quicksort độ phức tạp N log2 N.
cải tiến dùng đếm phân phối, độ phức tạp O(n).
3. Code tham khảo P153PROF PTIT spoj
Xem code để hiểu rõ hơn (NlogN và O(n)):
a. Code N log2 N
const fi='';
nmax=2*100000;
type data=longint;
mang=array[0..nmax+1] of data;
var
f:text;
A,b:array[0..nmax+1] of data;
n:data;
procedure sort(var A:mang; l,r: longint);
var
i,j,x,y: longint;
begin
i:=l;
j:=r;
x:=a[(l+r) div 2];
repeat
while a[i]<x do inc(i);
while x<a[j] do dec(j);
if not(i>j) then
begin
y:=a[i];
a[i]:=a[j];
a[j]:=y;
inc(i);
j:=j-1;
end;
until i>j;
if l<j then
sort(a,l,j);
if i<r then
sort(a,i,r);
end;
procedure docfile;
var i,j:data;
begin
assign(f,fi); reset(f);
readln(f,n);
for i:=1 to n do
read(f,a[i]);
for i:=1 to n do
read(f,b[i]);
close(f);
end;
procedure xuli;
var i,j,res:data;
begin
res:=0;
i:=1;
j:=1;
while (i<=n) and (j<=n) do
begin
if b[j]>A[i] then
begin
inc(res);
inc(i);
inc(j);
end
else
inc(j);
end;
writeln(res);
end;
begin
docfile;
sort(a,1,n);
sort(b,1,n);
xuli;
end.
b. Code O(n)
const fi='';
nmax=200000;
type data=longint;
var
f:text;
A,b:array[1..400000] of data;
n:data;
procedure docfile;
var i,j,x,spta,sptb:data;
begin
assign(f,fi); reset(f);
readln(f,n);
fillchar(a,sizeof(a),0);
b:=a;
for i:=1 to n do
begin
read(f,x);
inc(a[x]);
end;
spta:=0;
for i:=1 to 400000 do
for j:=1 to a[i] do
begin
inc(spta);
a[spta]:=i;
end;
for i:=1 to n do
begin
read(f,x);
inc(b[x]);
end;
sptb:=0;
for i:=1 to 400000 do
for j:=1 to b[i] do
begin
inc(sptb);
b[sptb]:=i;
end;
close(f);
end;
procedure xuli;
var i,j,res:data;
begin
res:=0; i:=1; j:=1;
while (j<=n) and (i<=n) do
begin
if b[j]>A[i] then
begin
inc(res);
inc(i);
end;
inc(j);
end;
writeln(res);
end;
begin
docfile;
xuli;
end.