Dữ liệu đa ra file có tên BAI2.OUT, gồm m dòng.. Viết chơng trình thực hiện các công việc sau: Thực hiện tách xâu thành 2 xâu: xauchar và xaunum trong đó xauchar là xâu gồm các chữ cái,
Trang 1Sở GD - ĐT Quảng Bình
Đề thi học sinh giỏi lớp 12 năm học 2007 – 2008
Câu 1: Cho dãy số A1, A2,…, An với (n<100, Ai là số nguyên và
1 < Ai <200 với i đi từ 1 đến n)
Hãy chọn ngẩu nhiên các phần tử của dãy thành hai nhóm sao cho tổng các phần tử trong mỗi nhóm chênh lệch nhau ít nhất
Yêu cầu:
Dữ liệu vào: Cho bởi file BAI1.INP trong đó
Dòng đầu tiên ghi số n
Dòng tiếp theo chứa giá trị các phần tử của dãy
Dữ liệu ra đợc ghi vào file BAI1.OUT trong đó:
Dòng thứ nhất ghi: Câu “Chenh lech:” và giá trị chênh lệch giữa hai nhóm
Dòng thứ hai ghi: “Nhom 1:”
Dòng thứ ba ghi: các phần tử của nhóm 1
Dòng thứ t ghi: “Nhom 2:”
Dòng thứ năm ghi: các phần tử của nhóm 2
Ví dụ:
Dữ liệu vào
File đầu vào BAI1.INP File đầu ra BAI2.OUT
Bài 2 Làm vờn.
Một mãnh vờn hình chử nhật đợc chia làm m hàng ngang và n hàng dọc (n,m<=50) Trên mỗi ô vờn có một số ô đã đợc trồng cây dài ngày không đợc trồng thêm, các ô còn lại sẽ đợc trồng bằng hai loại cây ngắn ngày là Lạc và vừng Hãy tìm cách trồng các cây ngắn ngày vào các ô trống sao cho tổng các ô trồng lạc và vừng trên mỗi hàng ngang và mỗi hàng dọc chênh lệch ít nhất
Yêu cầu:
Dữ liệu vào cho bởi file BAI2.INP trong đó
- Dòng thứ nhất chứa hai giá trị m và n
- Mỗi dòng trong m dòng tiếp theo chứa n số 0 hoặc 1 Số 0 chỉ
ô đã trồng cây dài ngày, số 1 chỉ ô cha trồng
9
2 2 3 4 5 6 7 8 9
chenh lech: 0 Nhom 1:
7 5 4 3 2 2 nhom 2:
6 8 9
Trang 2Dữ liệu đa ra file có tên BAI2.OUT, gồm m dòng Mỗi dòng có n
số nhận giá trị 0, 1 hoặc 2 trong đó
- Số 0 chỉ ô đã trồng cây dài ngày
- Số 1 chỉ ô trồng lạc
- Số 2 chỉ ô trồng vừng
Ví dụ:
File đầu vào BAI2.INP File đầu ra BAI2.OUT
Bài 3:
Cho một xâu bao gồm những chữ cái in hoa và các chữ số từ 0…9
Viết chơng trình thực hiện các công việc sau:
Thực hiện tách xâu thành 2 xâu: xauchar và xaunum trong
đó xauchar là xâu gồm các chữ cái, xaunum là xâu gồm các chữ
số, đợc giữ nguyên thứ tự từ trái sang phải
Thực hiện sắp xếp xâu xauchar theo thứ tự lớn dần(ABCD…) Tìm độ dài lớn nhất của một xâu con trong xâu xaunum có
các giá trị lập thành một cấp số cộng và đa xâu con đó ra (lu ý; Nếu có nhiều xâu con lập thành một cấp số cộng có độ dài bằng nhau thì đa xâu con tìm đợc đầu tiên từ trái sang phải)
Yêu cầu
Dữ liệu vào cho bởi tệp BAI3.INP
Dữ liệu đa ra tệp có tên BAI3.OUT trong đó
- Dòng thứ nhất ghi xâu xauchar đã sắp xếp
- Dòng thứ hai ghi độ dài lớn nhất của xâu con (trong xâu
xaunum) tạo thành cấp số cộng
- Dòng thứ ba ghi xâu con (trong xâu xaunum) lập thành cấp
số cộng
Ví dụ
5 6
1 1 0 1 1 0
0 1 1 0 1 1
1 0 0 1 1 1
1 0 1 0 1 0
1 0 0 1 1 1
1 1 0 2 1 0
0 2 1 0 2 1
2 0 0 1 1 2
1 0 2 0 2 0
2 0 0 1 1 1
5 6
1 1 0 1 1 0
0 1 1 0 1 1
1 0 0 1 1 1
1 0 1 0 1 0
1 0 0 1 1 1
1 1 0 2 1 0
0 2 1 0 2 1
2 0 0 1 1 2
1 0 2 0 2 0
2 0 0 1 1 1
JKSGFJKKL32123456789310KJKDJH
GF
DFFGGHJJJJKKKKKLS 9
123456789
Trang 3File ®Çu vµo BAI3.INP File ®Çu ra
BAI3.OUT
Trang 4§¸p ¸n
Bµi 1
Program BAI1;
Const MaxN=100;
fi='bai1.inp';
fo='bai2.out' ;
Var A:Array[1 MaxN] of 0 200;
N1: array[1 MaxN] of 0 1;
V: array[1 2,0 20000] of 0 1; N: Byte;
Max, j1,j2, clech: Longint;
Procedure Docfile;
Var i: Byte;
f: Text;
Begin
Assign(f,fi); reset(f);
Readln(f,n);
For i:=1 to n do
Read(f,a[i]);
Close(f);
End;
Procedure Khoitao;
Begin
docfile;
fillchar(v,sizeof(v),0);
fillchar(N1,sizeof(N1),0);
End;
Procedure Chiaday;
var i: Byte;
j: Longint;
Begin
v[1,0]:=1;
Max:=0;
For i:=1 to n do
Begin
For j:= max downto 0 do
If v[1,j] =1 then
if v[1,j+A[i]] = 0 then
Begin
v[1,j+A[i]]:=1;
v[2,j+A[i]]:=i;
End;
Max:=Max +a[i];
Trang 5End;
j1:= Max div 2;
While v[1,j1] = 0 do dec(j1); j2:= Max -j1;
Clech:=j2-j1;
End;
Procedure Ghitep;
Var i: longint;
f:text;
Begin
Assign(f,fo); rewrite(f);
i:=j1;
writeln(f,'chenh lech: ',clech); Writeln(f,'Nhom 1:');
While i>=1 Do
Begin
Write(f,A[v[2,i]],' ');
N1[v[2,i]]:=1;
i:=i- a[v[2,i]];
end;
Writeln(f);
Writeln(f,'nhom 2:');
For i:=1 to n do
If N1[i] =0 then
Write(f,A[i],' ');
close(f);
End;
BEGIN
Khoitao;
Chiaday;
Ghitep;
End
Trang 6Bµi 2
Program bai2;
Const fi='bai2.inp';
fo='bai2.out';
Var a : array[1 50,1 50] of Byte; d,c : array[1 50] of Byte;
n,m, dem, soluong: Byte;
Lcay:Byte;
Procedure Docfile;
Var i,j: Byte;
f:Text;
Begin
Assign(f,fi); reset(f);
Read(f,n,m);
Fillchar(d,sizeof(d),0);
Fillchar(c,sizeof(c),0);
Soluong:=0;
for i:=1 to n do
for j:= 1 to m do
Begin
Read(f,a[i,j]);
If a[i,j]=1 then
Begin
Inc(d[i]);
Inc(c[i]);
Inc(soluong);
End;
End;
Close(f);
End;
Function Timc(x:Byte):Byte;
Var j:Byte;
Begin
Timc:=0;
For j:= 1 to m do
If a[x,j]=1 then
Begin
Timc:=j;
Break;
End;
End;
Function Timd(x:Byte):Byte;
Var j:Byte;
Trang 7Timd:=0;
For j:= 1 to n do
If a[j,x]=1 then
Begin
Timd:=j;
Break;
End;
End;
Procedure chond(var p,q:Byte); Var i,j:Byte;
Begin
q:=3;
For i:=1 to n do
if odd(d[i]) then
Begin
p:=i;
q:=1;
Break;
End;
For j:=1 to m do
if odd(c[i]) then
Begin
p:=j;
q:=2;
Break;
End;
For i:=1 to n do
if d[i]>0 then
Begin
p:=i;
q:=1;
Break;
End;
End;
Procedure Di(x,y:Byte);
Var i,j: Byte;
Begin
Repeat
If y=1 then
Begin
j:=timc(x);
If j>0 Then
Trang 8Begin
Inc(dem);
Dec(d[x]);
Dec(c[j]);
Inc(a[x,j],y); y:=3-y;
x:=j;
End
Else
Break;
End
Else
Begin
i:=timd(x);
If i>0 Then
Begin
Inc(dem);
Dec(d[i]);
Dec(c[x]);
Inc(a[i,x],y); y:=3-y;
x:=i;
End
Else
Break;
End;
Until False;
End;
Procedure Xuly;
Var p,q:Byte;
Begin
Dem:=0;
Repeat
Chond(p,q);
di(p,q);
Until dem=soluong; End;
Procedure Ghitep;
Var i,j:Byte;
f:Text;
Begin
Assign(f,fo); Rewrite(f); for i:=1 to n do
Trang 9Begin
For j:=1 to m do
If a[i,j]>0 then Write(f,a[i,j]-1,' ') Else
Write(f,0,' '); Writeln(f);
End;
Close(f);
End;
BEGIN
Docfile;
xuly;
ghitep;
END
Trang 10Bµi 3
Program BAI1;
Const MaxN=100;
fi='bai3.inp';
fo='bai3.out' ;
Var A:Array[1 MaxN] of byte;
B:array[1 Maxn] of byte;
c:array[1 Maxn] of byte;
DCSC,s:string;
t:integer;
max,vt:byte;
xauchar, xaunum,stt:string;
Procedure Docfile;
Var i: Byte;
f: Text;
Begin
Assign(f,fi); reset(f);
Readln(f,s);
Close(f);
End;
Procedure TACHXAU;
Var i:Byte;
Begin
xauchar:='';
xaunum:='';
i:=1;
While i<= length(s) do
Begin
If (s[i]>='A')and(s[i]<='Z') then
Begin
xauchar:=xauchar+s[i];
Xaunum := Xaunum + '';
End
Else
Begin
Xauchar:=Xauchar+'';
Xaunum:=xaunum+s[i];
End;
i:=i+1;
end;
For i:=1 to length(xauchar) do
if xauchar[i]=''then delete(xauchar,i,1); For i:=1 to length(xaunum) do
Trang 11if xaunum[i]=''then delete(xaunum,i,1); End;
Procedure XLCHAR(st:string);
var n,i,j:Byte;
TG:byte;
Begin
n:=length(st);
for i:= 1 to maxn do
a[i]:=0;
for i:= 1 to n do
a[i]:=ord(st[i]);
for i:= 1 to n do
for j:= 1 to n-1 do
if a[i] < a[j] then
Begin
TG:=A[i];
A[i]:=A[j];
A[j]:=TG;
End;
stt:='';
for i:=1 to n do
stt:= stt + chr(a[i]);
End;
Procedure XLNUM(NUM:String);
Var d,i,j,n:byte;
BCX:string;
Begin
n:=length(xaunum);
For i:=1 to n do
Val(xaunum[i],b[i],t);
d:=b[2]-a[1];
c[1]:=1;
c[2]:=2;
for i:=3 to n do
if b[i]-b[i-1]=d then
Begin
c[i]:=c[i-1]+1;
end
Else
Begin
c[i]:=2;
d:=b[i]-b[i-1];
end;
Trang 12max:=2;
for i:=1 to n do
if c[i]>max then
begin
max:=c[i];
vt:=i;
end;
for j:=vt downto vt-max+1 do
Begin
str(b[j],bcx);
DCSC:=DCSC+ bcx;
End;
end;
Procedure ghitep;
Var f:text;
Begin
assign(f,fo); rewrite(f);
Writeln(f,stt);
Writeln(f,max);
Write(f,DCSC);
end;
BEGIN
docfile;
tachxau;
XLCHAR(xauchar);
XLNUM(xaunum);
ghitep;
End
Biểu điểm
Bài 1 (3đ) Chơng trình rõ ràng, đúng Bài 2 (5đ) Chơng trình rõ ràng, đúng Bài 3 (2đ) Chơng trình rõ ràng, đúng