PTIT123A PTIT spoj – Sắp xếp 2

Nguồn đề bài: http://www.spoj.com/PTIT/problems/PTIT123A/

1. Đề bài PTIT123A PTIT spoj

Cho một danh sách chứa cả các số và các từ. Yêu cầu bạn hãy sắp xếp danh sách này tăng dần sao cho các từ theo thứ tự từ điển, các số theo thứ tự số. Hơn nữa, nếu phần tử thứ n là số thì danh sách sau khi sắp xếp phần tử thứ n cũng phải là số, nếu là từ thì vẫn là từ.

Lưu ý: Các từ chỉ gồm các chữ in thuờng trong bảng chữ cái tiếng Anh.

Input

Gồm nhiều dòng, mỗi dòng là một danh sách. Mỗi phần tử của danh sách cách nhau bởi dấu phẩy (“,”) theo sau là dấu cách, và danh sách được kết thúc bằng dấu chấm (“.”).

Dữ liệu kết thúc bởi dòng chỉ chứa một dấu chấm.

Output

Với mỗi danh sách trong dữ liệu, xuất ra danh sách đã sắp xếp thỏa mãn yêu cầu đề bài (có định dạng như trong dữ liệu).

Example

Input:
0.

banana, strawberry, orange.

banana, strawberry, orange.

10, 8, 6, 4, 2, 0.

x, 30, -20, z, 1000, 1, y.

50, 7, kitten, puppy, 2, orangutan, 52, -100, bird, worm, 7, beetle.

.
Output:
0.

banana, orange, strawberry.

banana, orange, strawberry.

0, 2, 4, 6, 8, 10.

x, -20, 1, y, 30, 1000, z.

-100, 2, beetle, bird, 7, kitten, 7, 50, orangutan, puppy, 52, worm.

2. Hướng dẫn PTIT123A PTIT spoj

– bài này ý tưởng khá đơn giản. lấy số bỏ ra 1 mảng, chữ bỏ ra 1 mảng. đồng thời cũng lưu lại vị trí là ở chữ/số thứ i nào đó thì ban đầu nó là số hay chữ (tạm gọi là mảng dd).

– sau đó sắp xếp mảng số, sắp xếp mảng chữ.

– dựa vào mảng DD, để xuất ra kết quả.

3. Code tham khảo PTIT123A PTIT spoj

const   fi='';
        nmax=1000000;
type    data=longint;
var
        f:text;
        s:ansistring;
        tmp:string;
        so:array[0..nmax+1] of data;
        chu:array[0..nmax+1] of string;
        dd:array[0..nmax+1] of data;
        n,nso,nchu:data;


procedure sortSO(l,r: longint);
      var
         i,j,x,y: longint;
      begin
         i:=l;  j:=r;  x:=so[(l+r) div 2];
         repeat
           while so[i]<x do inc(i);
           while x<so[j] do dec(j);
           if not(i>j) then
             begin
                y:=so[i];
                so[i]:=so[j];
                so[j]:=y;
                inc(i);  j:=j-1;
             end;
         until i>j;
         if l<j then sortSO(l,j);
         if i<r then sortSO(i,r);
      end;

procedure sortCHU(l,r: longint);
      var
         i,j: longint;
         x,y:string;
      begin
         i:=l;  j:=r;  x:=chu[(l+r) div 2];
         repeat
           while chu[i]<x do inc(i);
           while x<chu[j] do dec(j);
           if not(i>j) then
             begin
                y:=chu[i];
                chu[i]:=chu[j];
                chu[j]:=y;
                inc(i);  j:=j-1;
             end;
         until i>j;
         if l<j then sortCHU(l,j);
         if i<r then sortCHU(i,r);
      end;


procedure xuli;
var     i,j,vt,dem,x,er:data;
begin
        n:=0;
        nso:=0;
        nchu:=0;
        tmp:='';
        for i:=1 to length(s) do
                begin
                        if (s[i]=',') or (s[i]='.') then
                                begin
                                        inc(n);
                                        if tmp[length(tmp)] in ['0'..'9'] then
                                                begin
                                                        dd[n]:=1; // la so
                                                        inc(nso);
                                                        val(tmp,x,er);
                                                        so[nso]:=x;
                                                end
                                        else
                                                begin
                                                        dd[n]:=2; // la chu
                                                        inc(nchu);
                                                        chu[nchu]:=tmp;
                                                end;
                                        continue;
                                end;
                        if s[i]=' ' then
                                begin
                                        tmp:='';
                                        continue;
                                end;
                        tmp:=tmp+s[i];
                end;
        sortso(1,nso);
        sortchu(1,nchu);
        nso:=0;
        nchu:=0;
        for i:=1 to n -1  do
                if dd[i]=1 then
                        begin
                                inc(nso);
                                write(so[nso],', ');
                        end
                else
                        begin
                                inc(nchu);
                                write(chu[nchu],', ');
                        end;
        if dd[n]=1 then
                begin
                        inc(nso);
                        write(so[nso],'.');
                end
        else
                begin
                        inc(nchu);
                        write(chu[nchu],'.');
                end;
        writeln;
end;


procedure docfile;
var     i,j:data;
begin
        assign(f,fi); reset(f);
        repeat

                readln(f,s);
                if s='.' then break;
                xuli;
        until false;
        close(f);
end;

begin
        docfile;
end.

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 *