Đội ôn thi tin học trẻ không chuyên năm 2012

Status
Không mở trả lời sau này.
C

cuong276

Lưu ý: đây là chỗ ôn thi, không phải là chỗ hỏi đáp về phần mềm. Muốn hỏi đáp thì bạn nên lập một pic riêng để hỏi. Sẽ có người giải đáp giúp bạn
Còn bây giờ thì tiếp tục ôn thi nào.

Một máy truyền tin có khả năng truyền mỗi lần một thông điệp dưới dạng một chuỗi nhị phân gồm N bit, các bit được truyền song song, mỗi bit sẽ được truyền trên một kênh truyền riêng biệt đến máy thu. Trong trạng thái bình thường, chuỗi nhận được máy thu giống hoàn toàn chuỗi đã được phát. Thật không may, do sơ suất khi lắp đặt máy thu, đã có 1 sự đảo lộn các kênh truyền. Hậu quả chuỗi nhận được tại máy thu lại là một hoán vị của chuỗi ban đầu.
Trong hoàn cảnh hiện tại, Vì cần phải sử dụng gấp các thiết bị truyền tin này phục vụ cho công việc, thời gian không cho phép để sửa chữa hoặc thay thế. nên tổ kĩ thuật buộc phải tìm cách phát hiện được sự hoán chuyển các kênh đã xảy ra để có thể khôi phục đúng những thông điệp đã gửi. Rất may, khi lắp đặt, người ta đã thử phát M chuỗi và ghi lại M chuỗi tương ứng nhận được tại máy thu.
Yêu cầu: là chuyên viên tin học, bạn hãy viết chương trình giúp tổ kĩ thuật chỉ ra sự tương ứng giữa các bit trong chuỗi phát đi và chuỗi nhận được nơi máy thu. Điều này nghĩa là, dữa trên M cặp chuỗi phát và thu tương ứng, bạn phải chỉ ra bỗ hoán vị [TEX]a_1,a_2,...,a_N[/TEX] trong đó cho biết bit thứ [TEX]a_i[/TEX] trong thông điệp gửi đi đã chuyển thành bit thứ i trong thông điệp nhận được.
Dữ liệu: Dữ liệu vào cho trong file văn bản có tên TRANSMIT.INP có cấu trúc như sau;
Dòng đầu chứa 2 số nguyên N,M ([TEX] 1<N\leq100 ,0<M\leq10000 [/TEX] ) cách nhau bởi dấu cách cho biết số bit trong mỗi thông điệp và số lượng thông điệp phát thử.
Mỗi dòng trong M dòng tiếp theo chứa 2 chuỗi bit. Mỗi chuỗi là 1 dãy liên tiếp N số 0 hoặc 1. Hai chuỗi cách nhau bởi 1 dấu cách. Chuỗi đầu là chuỗi phát đi và chuỗi thứ 2 là chuỗi tương ứng nhận được tại máy thu.
Kết quả: ghi ra file văn bản có tên TRANSMIT.OUT với 1 dòng duy nhất có nội dung như sau:
Nếu với M cặp thông điệp dã cho có thể xác định duy nhất bộ hoán vị [TEX] a_1,a_2,...,a_N [/TEX]thì file kết quả sẽ chứa N số nguyên cho biết bộ hoán vị này. Các số trên cùng 1 dòng cách nhau bởi 1 dấu cách, ngược lại thì file kết quả chỉ chứa duy nhất 1 số -1
Ví dụ
TRANSMIT.INP
11110000 11110000
11001100 11001010
10101010 10101001
TRANSMIT.OUT
1 2 3 4 5 8 6 7
 
T

tmb12

Lưu ý: đây là chỗ ôn thi, không phải là chỗ hỏi đáp về phần mềm. Muốn hỏi đáp thì bạn nên lập một pic riêng để hỏi. Sẽ có người giải đáp giúp bạn
Còn bây giờ thì tiếp tục ôn thi nào.


Xin lỗi! Mình sẽ không làm mất thời gian của các bạn nữa! Các bạn chăm chỉ quá!
p/s: Đừng xóa bài mình
 
Last edited by a moderator:
C

cuong276

Nếu bạn muốn thì bạn cũng có thể tham gia ôn cùng bọn tớ.
Tớ chỉ nhắc nhở thế thôi.
Ở đây cứ tự nhiên đi.
Có bài nào hay, bài nào khó thì cứ post lên rồi cùng nhau giải quyết
 
C

cuong276

Việc đọc thì chẳng khó khăn gì
Mình đang băn khoăn làm cách nào để tìm hoán vị.
Nếu bắt đầu tìm ở cái thứ nhất trong text trên thì chắn chắn là không được
Bắt đầu tìm ở cái thứ 2 thì lại có rất nhiều hoán vị
Tiếp tục tìm các dãy còn lại thì lại phải tiếp tục so sánh đến hết mới thôi
Mình đang rối không biết so sánh thế nào đây.
 
M

mikelhpdatke

Để mình xem xét lại rồi post thuật toán.

P/s:
Thi THT toàn quốc có thi về QHĐ trên bảng 2 chiều ko nhể
 
Last edited by a moderator:
T

thitgachien

[mọi ngươi xem bản code này đi!
PHP:
var m,n,i,j,k,dem,h:integer;
    q:array[1..50]of integer;
    a,b:array[1..15] of string;
    x,y:array[1..50]of string;
    c:array[1..50]of string;
    tg:string;
    f,g:text;
begin
  assign(f,'transmit.inp');reset(f);
  assign(g,'transmit.out');rewrite(g);
  readln(f,n,m);
  for i:=1 to m do
   begin
    read(f,c[i]);
    readln(f);
   end;
  for i:=1 to m do a[i]:='';
  for i:=1 to m do b[i]:='';
  for i:=1 to m do
   begin
     for j:=1 to n do
       a[i]:=a[i]+c[i][j];
     for j:=n+2 to n*2+1 do
       b[i]:=b[i]+c[i][j];
   end;
  for j:=1 to n do q[j]:=j;
  for j:=1 to n do x[j]:='';
  for j:=1 to n do
   for i:=1 to m do
    x[j]:=x[j]+a[i][j];
  for j:=1 to n do
   for i:=1 to m do
    y[j]:=y[j]+b[i][j];
  dem:=0;
  for j:=1 to n-1 do
   begin
    if x[j]<>y[j] then
     for k:=j+1 to n do
         if x[j]=y[k] then
            begin
                 h:=q[k];
                 q[k]:=q[j];
                 q[j]:=h;
                 tg:=x[j];
                 x[j]:=x[k];
                 x[k]:=tg;
                 dem:=dem+1;
            end;
   end;
  if dem=0 then write('g,-1')
  else
   for j:=1 to n do
    write(g,q[j]:2);
 close(f);close(g);
readln
end.
 
C

cuong276

[mọi ngươi xem bản code này đi!
PHP:
var m,n,i,j,k,dem,h:integer;
    q:array[1..50]of integer;
    a,b:array[1..15] of string;
    x,y:array[1..50]of string;
    c:array[1..50]of string;
    tg:string;
    f,g:text;
begin
  assign(f,'transmit.inp');reset(f);
  assign(g,'transmit.out');rewrite(g);
  readln(f,n,m);
  for i:=1 to m do
   begin
    read(f,c[i]);
    readln(f);
   end;
  for i:=1 to m do a[i]:='';
  for i:=1 to m do b[i]:='';
  for i:=1 to m do
   begin
     for j:=1 to n do
       a[i]:=a[i]+c[i][j];
     for j:=n+2 to n*2+1 do
       b[i]:=b[i]+c[i][j];
   end;
  for j:=1 to n do q[j]:=j;
  for j:=1 to n do x[j]:='';
  for j:=1 to n do
   for i:=1 to m do
    x[j]:=x[j]+a[i][j];
  for j:=1 to n do
   for i:=1 to m do
    y[j]:=y[j]+b[i][j];
  dem:=0;
  for j:=1 to n-1 do
   begin
    if x[j]<>y[j] then
     for k:=j+1 to n do
         if x[j]=y[k] then
            begin
                 h:=q[k];
                 q[k]:=q[j];
                 q[j]:=h;
                 tg:=x[j];
                 x[j]:=x[k];
                 x[k]:=tg;
                 dem:=dem+1;
            end;
   end;
  if dem=0 then write('g,-1')
  else
   for j:=1 to n do
    write(g,q[j]:2);
 close(f);close(g);
readln
end.
Thứ nhất: Với bộ text:
8 3
11110000 11110000
10101010 10101010
11001010 11001010
Thì output của bạn chẳng ra cái gì cả
Thứ hai: Yêu cầu giải thích thuật toán.
 
T

thitgachien

tớ test được mà cương
giải thích:
quy luật là đổi chỗ theo hàng dọc thì sẽ tìm được bản đúng.
ta sẽ có sự thay đổi khi đổi chỗ hai xâu xj cho xk đúng không?
tớ nghĩ cậu test sai rùi!
 
M

mikelhpdatke

Mã:
if dem=0 then write('g,-1')
  else
   for j:=1 to n do
    write(g,q[j]:2);

Bạn giải thích chỗ này đi. Tại sao dem=0 thì ko in ra

Mà mình chưa hiểu thuật lắm
 
C

cuong276

Mã:
if dem=0 then [COLOR="Red"]write('g,-1')[/COLOR]
  else
   for j:=1 to n do
    write(g,q[j]:2);
Nhìn kĩ đi Hoàng à. Cái đỏ này là cái gì.
Tớ chắc chắn là cậu đang chỉ thử với bộ text mà đề bài cho mà thôi.
Thử bộ text này xem
8 5
11110000 11110000
10101010 10101100
10010110 10010101
10100101 10100011
00110110 00110101
Thì output phải là 1 2 3 4 5 7 8 6
Nhưng output của cậu lại là 1 2 3 4 5 8 7 6
Chứng tỏ là chương trình của cậu sai sót chỗ nào đó.
Kiểm tra lại đi nha
 
Last edited by a moderator:
T

thiennu274

Mình có bài này:
Bài toán con kiến
Trên một sân hình chữ nhật mxn, được chia thành các ô vuông đơn vị, mỗi ô chứa một lượng thức ăn. Một con kiến xuất phát từ ô (1,1) muốn đi qua sân đến dòng thứ m để lấy thức ăn trong ô.
Con kiến chỉ có thể đi mỗi lần một ô (hoặc ngang, hoặc xuống). Hãy chỉ ra đường đi để con kiến có được lượng thức ăn nhiều nhất.Bài này là QHĐ mảng 2 chiều ấy. Bạn nào up code lên dùm mình
Thanks nhìu
 
M

mikelhpdatke

n hàng
m cột
cơ sở QHĐ tự tính nha
F[i,j] là số lượng thức ăn lớn nhất khi đi từ ô 1,1 đến ô i,j.
F[i,j]:=Max(F[i,j-1],F[i-1,j])+W;

Kết quả của bài toán là max(F[n,j]) với j chạy 1->m


P/s: Post code có hiểu thuật toán ko xem = thừa :-S
 
1

11thanhkhoeo

Có lẽ ở đây chúng t chỉ bàn về thuật toán thôi

Nếu cần code thì nói bởi vi có thuật toán thì sẽ code được thôi

Thân
 
T

thiennu274

n hàng
m cột
cơ sở QHĐ tự tính nha
F[i,j] là số lượng thức ăn lớn nhất khi đi từ ô 1,1 đến ô i,j.
F[i,j]:=Max(F[i,j-1],F[i-1,j])+W;

Kết quả của bài toán là max(F[n,j]) với j chạy 1->m


P/s: Post code có hiểu thuật toán ko xem = thừa :-S


mình bik cái thuật toán, nhưng chả hiểu sao viết cái code nó bị lỗi. Chạy tay máy lần, kiểm tra lỗi mà hok biết sai chỗ nào. bạn rãnh thì post code lên, mình dò :D;)
 
T

thiennu274

Code:
var a,b:array[0..100,0..100] of longint;n,m,i,j:longint;f:text;
procedure xuly;
var i,j,n1,m1,max:longint;
begin
for i:= 2 to m do
for j:= 2 to n do
if (i<>n) and (b[i,j-1]>=b[i-1,j]) then b[i,j]:=a[i,j]+b[i,j-1]
else b[i,j]:=a[i,j]+b[i-1,j];
max:=b[m,1];
for i:= 2 to n do
if b[m,i]>=max then begin max:=b[m,i]; n1:=n; m1:=i; end;
writeln(max);
while (n1<>1) or (m1<>1) do
begin
write('(',n1,',',m1,')-->');
if b[m1-1,n1]<b[m,n1-1] then n1:=n1-1 else
m1:=m1-1;
end;
write('(1,1)');
writeln;
end;
begin
assign(f,'kien.txt');
reset(f);
read(f,m,n);
for i:= 1 to m do
begin
for j:= 1 to n do
read(f,a[i,j]);
readln(f);
end;
fillchar(b,sizeof(b),0);
xuly;
readln;
end.
Xem code rồi sửa dùm mình nhaz:D, thanks nhìu
 
Status
Không mở trả lời sau này.
Top Bottom