BWPOINTS spoj – Nối điểm đen trắng
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 ...
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++
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | #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
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | 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]
