Dịch đề bài: BWPOINTS
1. Đề bài BWPOINTS spoj
Trên trục số thực cho n điểm đen và n điểm trắng hoàn toàn phân biệt. Các điểm đen có tọa độ nguyên a1, a2, …, an còn các điểm trắng có tọa độ nguyên b1, b2, …, bn. Người ta muốn chọn ra k điểm đen và k điểm trắng để nối mỗi một điểm đen với một điểm trắng sao cho k đoạn thẳng tạo được đôi một không có điểm chung.
Yêu cầu: Cho tọa độ của n điểm đen a1, a2, …, an và tọa độ của điểm trắng b1, b2, …, bn. Hãy tìm giá trị k lớn nhất thỏa mãn yêu cầu trên.
Dữ liệu:
Dòng thứ nhất chứa số nguyên dương n (n <= 10^5).
Dòng thứ hai chứa các số a1, a2, …, an (|ai| <= 10^9, i = 1, 2,…, n)
Dòng thứ ba chứa các số b1, b2, …, bn (|bi| <= 10^9, i = 1, 2,…, n)
Các số trên cùng một dòng được ghi cách nhau ít nhất một dấu cách.
Kết quả: Ghi ra một số nguyên duy nhất là số k lớn nhất tìm được
Ví dụ:
Dữ liệu
3
0 3 1
-3 5 -1
Kết quả
2
2. Code tham khảo BWPOINTS spoj
a. Code c++
#include <bits/stdc++.h> using namespace std; typedef pair<int, bool> Diem; int n; vector< pair<int, bool> > a; void Init() { scanf("%d",&n); int x; for (int i=0;i<n;i++) { scanf("%d",&x); a.push_back(make_pair(x,true)); } for (int i=0;i<n;i++) { scanf("%d",&x); a.push_back(make_pair(x,false)); } } bool cmp(Diem a, Diem b) { return a.first<b.first; } void Solve() { sort(a.begin(),a.end(),cmp); int res=0; int i=1; while(i<2*n) { if(a[i].second != a[i-1].second) { res++; i+=2; } else i++; } printf("%d",res); } int main() { Init(); Solve(); }
b. Code pascal
const fi=''; nmax=100000; type data=longint; var f:text; A:array[1..nmax*2] of data; Status:array[1..nmax*2] of byte; // 0 la trang , 1 la den dd:array[1..nmax*2] of boolean; N:data; procedure docfile; var i:data; begin assign(f,fi); reset(f); readln(f,n); for i:=1 to n do begin read(f,a[i]); status[i]:=1; end; for i:=n+1 to 2*n do begin read(f,a[i]); status[i]:=0; end; n:=2*n; close(f); end; procedure swap(var a,b:data); var tam:data; begin tam:=a; a:=b; b:=tam; end; procedure swap1(var a,b:byte); var tam:byte; begin tam:=a; a:=b; b:=tam; end; procedure QS(l,r:data); var i,j,mid:data; begin i:=l; j:=r; mid:=a[(l+r) div 2]; repeat while a[i]<mid do inc(i); while a[j]>mid do dec(j); if i<=j then begin swap(a[i],a[j]); swap1(status[i],status[j]); inc(i); dec(j); end; until i>j; if L<=j then QS(l,j); if i<=r then QS(i,r); end; procedure xuli; var i,dem:data; begin dem:=0; qs(1,n); for i:=1 to n do dd[i]:=false; for i:=1 to n-1 do if not dd[i] then //if ((status[i]=1) and (status[i+1]=0)) or ((status[i]=0) and (status[i+1]=1)) then if status[i]<>status[i+1] then begin inc(dem); dd[i]:=true; dd[i+1]:=true; end; writeln(dem); end; begin docfile; xuli; end.
[/sociallocker]