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 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]

 

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *