You are on page 1of 64

NH HNG CHUYN MN

trong o to bi dng hc sinh nng khiu Tin hc


A NH HNG
Cc cuc thi Olympic Tin hc c trin khai rng ri gn ht cc nc trn
th gii hng ti cc mc ch:
y mnh phong tro dy v hc Tin hc nhm p ng cc yu cu ca
cuc sng ang c tin hc ha su rng v vi tc cao trong mi
lnh vc,
Pht hin cc nhn t ni bt o to v khai thc ngun nhn lc nh
cao, c tri thc v c tay ngh theo kp s pht trin ca l thuyt v yu
cu ca thc t.
Vic o to, bi dng hc sinh gii Tin hc chu tc ng rt nhiu ca hai
yu t:
S pht trin ca l thuyt,
S pht trin ca cng c Tin hc.
C th thy r xu hng dy v hc Tin hc cho n nay chia thnh ba giai
on:
Giai on I: nhng nm cui ca th k XX,
Giai on II: Thp k u tin ca th k XXI,
Giai on III: Thp k th 2 ca th k XXI, tc l nhng nm hin ti.
giai on I, ngnh Tin hc mi tch ra v pht trin thnh mt ngnh khoa
hc c lp. Ngi ta tp trung mi sc lc vo vic xy dng nn mng cho
mt ngnh khoa hc mi, c gng tm cch gii quyt c cc lp bi ton
truyn thng xut hin khi tip cn bi ton trn quan im ton hc. Vic
nm vng cc kin thc ton hc l iu kin ch yu gii quyt cc bi ton
tin hc. Ngoi ra cn phi lu ti cc rng buc t nhin v b nh nh v tc
tng i thp ca my tnh lc by gi. l s tip tc ca t duy nhng
nm 70 80 ca th k 20.
V d, bi Hnh vung diu k (Bi 3 ngy 2 IOI 1996) vo thi im l mt
bi kh.

Hnh vung diu k


1/64

Nhng thnh cng ca khi lp phng k diu l ng lc ng Rubic


xut phng n phng ca tr chi ni ting ny. l mt bng gm 8 hnh
vung xp thnh 2 hng (xem
hnh v).
7

Ph
p

bi
n

Php bin i
1 2 3 4
Trong bi ny chng ta xt
B
phng n khi mi hnh vung
4 1 2 3
1 2 3 4
Php bin
c t mt mu khc nhau. Mu
i A
Php bin i 5 8
7 6
8 7 6 5
c nh bng tm s nguyn
B
Trng thi ban u
Php bin
dng u tin (xem hnh v).
1 7 2 4
i C
Cu hnh ca bng c xc nh
8 6 3 5
bng cch cho mu ca cc hnh
vung, bt u t hnh gc trn
tri v i theo chiu kim ng h. V d, hnh bn cu hnh ban u ca bng
c xc nh bi dy (1, 2, 3, 4, 5, 6, 7, 8).

p
Ph

n
bi

C 3 php bin i c s k hiu l A, B v C tc ng ln bng:


A: Hon i v tr 2 dng trn v di,
B: y vng trn ct cui ln ct u,
C: y vng trn theo chiu kim ng h 4 hnh vung gia.
Cho mt cu hnh cui ca bng. Nhim v ca bn l vit chng trnh xc
nh dy php bin i c s a bng t trng thi ban u nu hnh bn v
trng thi cui cho (Bi ton con A). Bn s nhn thm 2 im thng nu s
php bin i trong li gii ca bn khng qu 300.
D liu: vo t file INPUT.TXT gm mt dng cha 8 s nguyn m t trng
thi cui ca bng.
Kt qu: a ra file OUTPUT.OUT, dng u tin cha s nguyn L di
ca dy php bin i. Mi dng trong L dng sau cha mt k t - tn php
bin i cn thc hin.
Cng c tr gip: Chng trnh MTOOL.EXE trong th mc cha bi c
cung cp th nghim thc hin cc php bin i v xc nh trng thi cui
ca bng. Li gi chng trnh c dng MTOOL input.txt
output.txt.
V d:
INPUT.TXT

OUTPUT.TXT
2/64

2 6 8 4 5 7 3 1

7
B
C
A
B
C
C
B

Phn tch: S lng trng thi khc nhau ca bng l 8! = 40 320. Vic t chc
loang v lu tr vt loang t trng thi ban u ti trng thi ch trong iu
kin hin nay khng phi l mt chuyn kh. Nhng vo thi im din ra k
thi, b nh c th c s dng ch l 64KB + 64KB cp pht ng v my
thc hin thuc loi 386 th l c mt vn ln.
Chng ta t c nhng kt qu rc r trong thi k ny v i ng gio
vin tin hc phn ln xut thn t gio vin chuyn ngnh ton. Hc sinh ca
chng ta c trang b kin thc c s v ton kh tt.
Giai on II t nhng nm 2001 n 2007, s tin b v cng ngh v s ph
cp ca cc h thng phn mm tin tin a n nhng s chuyn dch
trong vic o to chuyn gia trong lnh vc tin hc. iu ny dn n nhng
thay i trong cng tc pht hin, o to v bi dng hc sinh gii tin hc.
Do ni dung thi Tin hc Quc t cng c nhiu thay i. Cc kin thc gii
thut c coi l nh cao trc y by gi tr thnh bng cu chng
m ai cng phi bit v phi thuc. Nhng gii thut phc tp, t dng th khng
nht thit phi thuc, nhng bt c ai v lc no cng c th tra cu, tm kim
chng trn Internet khi cn thit. S thng minh v tnh sng to by gi phi
th hin khng phi ch bn thuc nhiu hay t cc gii thut khc nhau, cng
khng phi bn ci t chng nhanh ti mc no. Th thch by gi l ch
bn c th tm ra nhng gii php hu hiu gii quyt mt cch c hiu qu cc
bi ton cc vn c m hnh ton hc n gin nhng c kch thc ln hay
khng?
t c mc ch ngi lp trnh phi bit tn dng ti a kh nng m
phn cng v h iu hnh cung cp. Cc h thng lp trnh mi nh Free
Pascal, Dev C++ (nhng phin bn u tin) to iu kin ngi dng
khai thc c ti a kh nng ca phn cng.
ng tic l ti tn nm 2007 khi th gii i ht chng ng quan trng ny
th chng ta mi c php chnh thc t chn ln mnh t in y du
3/64

chn ca nhng ngi tin phong, i vo con ng vn by gi tr thnh k


nim p ca nhng ngi i trc.
giai on III, tc l nhng nm gn y, trong danh mc yu cu i vi
ngi lp trnh c thm cc i hi mi:
Khng nhng bn phi ng vng trn nn tng ca phn cng v h
thng m cn phi bit khai thc ti a kh nng ca cng c lp trnh.
C th, bn phi khai thc c trit mt mnh ca cc th vin ca
h thng lp trnh c trong tay,
Nng cao tnh hon thin ca chng trnh: chng trnh phi cho kt qu
ng v x l c hiu qu vi tng lp d liu (ca bi ton).
Phi bit to mt chng trnh linh hot, kt hp vi loi gii thut gii
mt bi ton vn rt n gin nu kch thc b.

4/64

V d, bi Vn bch tho (Thi ton Lin bang Nga 04/2011).


VN BCH THO

Trong vn bch tho c mt khu t hnh ch nht kch thc wh trng mt


loi cy c bit qu him. Vi mi cy ngi ta lm mt li i to thnh hnh
vung c cy tm. Kch thc hnh
vung ph thuc vo vng b r ca cy y
(w, h)
lan ti. Nu to h ta khu t ny
c 2 nh i l (0, 0) v (w, h) th nh
tt c cc hnh vung u c ta
nguyn. Hai hnh vung bt k khng c
phn chung din tch khc 0, tng din
tch cc hnh vung c cy ng bng
din tch khu t, cnh hnh vung song
song vi trc ta .
Thi gian tri i v c mc um tm che
kn cc li i. Ngi ta cn v bn
khi phc li cc li i lp trnh iu
khin r bt chm sc cy.

1
1

Yu cu: Cho w, h, n, xi, yi, trong n


l s cy, (xi, yi) ta cy th i (1 w, h 1012, 1 n 2105). Hy xc
nh di cnh hnh vung bao quanh mi cy. D liu m bo tn ti li
gii.
D liu: Vo t file vn bn GARDEN.INP:
Dng u tin cha 3 s nguyn w, h v n,
Dng th i trong n dng sau cha 2 s thc xi v yi.
Kt qu: a ra file vn bn GARDEN.OUT n s nguyn trn n dng, dng
th i cha cnh hnh vung c tm l cy th i.
V d:
GARDEN.INP
4 6 3
1 1
3 1
2 4

GARDEN.OUT
2
2
4

Phn tch: t c im ti a cn phi bit t chc lu tr d liu di


dng th cy, thc hin cc php x l cy, t chc tm kim nh phn trn
trn .
5/64

Cc h thng lp trnh nh Free Pascal 2.4.4, Dev C++ 4.9.9 u cung cp


nhng th vin khng l h tr ngi dng v u c th mang li nhng hiu
qu tng ng trong lp trnh. Tuy vy C++ nhn c s la chn ng o
th sinh d thi hn v cc l do:
Th vin chun h tr lp trnh ca C++ d tip cn hn v c nhiu ti
liu gii thiu,
C nhiu phin bn chng trnh dch min ph nhng Ban t chc
cung cp cho th sinh,
nhiu nc ly C++ lm c s ging dy trng ph thng,
Trong tng lai, khi ln i hc ngi ta s dng C++ l ch yu,
Mt mnh ca Pascal l kh nng th hin c cu trc trong qu trnh
trin khai gii thut khng cn l trng tm trong ni dung ging dy,
C++ cho php xy dng chng trnh ti u, th hin cc tiu xo lp
trnh.
Tuy vy, C++ cng c nhng mt yu ca n so vi Pascal. Ta s ni n
nhng vn ny mun hn, khi cp ti cng c lp trnh.
B CNG C LP TRNH
Trang b kin thc v ngn ng lp trnh cha bao gi l mt vn ln trong
tin hc. iu quan trng l k thut lp trnh v t chc d liu. Khi bit
tng i tt mt ngn ng lp trnh th vic chuyn sang lp trnh mt ngn
ng mi kh n gin.
Bn cnh ngn ng truyn thng PASCAL vi h thng lp trnh Free Pascal v
C++ vi h thng lp trnh DEV C++, nhiu nc cn cho php v khuyn
khch s dng mt lot cc ngn ng khc nh Delphi, Python, Java, C#, v . v .
..
ng nhin, khi chn mt ngn ng no lm cng c cho mnh ngi lp
trnh cn phi:
Bit r nhng im mnh v yu ca ngn ng cng nh ca h thng h
thng lp trnh h tr,
Cn nm vng cc dch v m h thng lp trnh cung cp,
Cn c thi quen suy ngh v hnh ng ph hp vi ngn ng v h
thng lp trnh,
Cn bit cng su cng tt cc th vin chun h tr lp trnh v bit
khai thc chng mt cch ti u.
6/64

Nu c cch tip cn hp l th nhng vn trn c th gii quyt c mt


cch kh n gin v hiu qu.
nc ta, trong bc PTTH h thng lp trnh c s dng ph bin l ngn
ng PASCAL vi h thng lp trnh Free Pascal. bc i hc, ngn ng lp
trnh ch yu l C/C++ vi h thng Dev C++.
Trn th gii nhiu nc s dng C++ vi cc h thng lp trnh Dev C++ hoc
tng ngngay t bc ph thng trung hc.
Vic ging dy i tr trong nh trng khng phi l vn tho lun y.
Nhng vic trang b cng c cho hc sinh nng khiu, phc v cho cc k thi
Tin hc l vn nm trong tm xem xt v x l ca chng ta.

Cc thnh phn v cu trc tng ng ca 2 h thng lp trnh


Cc php tnh s hc
Stt

V d

PASCAL C/C++
+
*
/
DIV
MOD

+
*
/
/
%

Pascal
a
a
a
a
n
n

+ b
- b
* b
/ b
div m
mod m

C/C++
a
a
a
a
n
n

+
*
/
/
%

b
b
b
b
m
m

Cc php tnh quan h


Stt

PASCAL C/C++
<
<=
=
>=
<>
and
or
not

<
<=
==
>=
!=
&&
||
!

V d
Pascal
a < b
a <= b
a = b
a >= b
a<>b
Pascal s dng cc
php x l bit to
biu thc quan h.

7/64

C/C++
a < b
a <= b
a == b
a >= b
a!=b

Cc php tnh x l bit


Stt

PASCAL C/C++
not
and
or
xor
shl
shr

V d
Pascal

C/C++

~
|
&
^
<<
>>

Khai bo
PASCAL

C++

Var i,j,k:integer;
m,n: longint;
a,b:real;
p,d:int64;
x:array[0..20] of longint;
y:array[1..10, 1..5] of longint;
z:array[1..15] of real;
c:char;
s:string;

int i,j,k;
long m,n,x[21], y[10][5];
float a,b,z[15];
long long p,d;
char c;
string s;

Lnh gn
C++

PASCAL
a:=y[i,j];
a:=a+b;
a:=a*z[i];
i:=i+1;
k:=i div j;
k:=i mod j;

a=y[i][j];
a+=b;
// a=a+b;
a*=z[i];
i++;
// ++i;
k=i/j;
k=i%j;

8/64

Lnh IF

Khng c then
PASCAL

if a<> b then c=c+5;


if a= b then z[i]:=0 else
begin
z[i]:= z[i]+c;
z[n-i]:=z[n-i]-c
end;

t iu kin
trong ngoc

Lu c ;

C++
if (a!=b) c+=5;
if (a==b)z[i]=0;
else
{z[i]+=c;
Z[n-i]-=c;
}
Lu c ;

Cu lnh FOR
C++

PASCAL
for i:=1 to n do
begin
. . . .
end;
for j:= n downto 1 do
begin
. . . .
end;

for (i=1;i<=n;i++)
{
. . . .
}
for (i=n;i>0;i--)
{
. . . .
}

Lu : C th khai bo bin i cc b ha trong chu trnh:


C++
for (int i=1;i<=n;i++){ . . . }
for (int i=n;i>0;i--) { . . . }

9/64

T chc chu trnh c s ln lp khng bit trc


C++

PASCAL
repeat
. . . . .
until j=i;

do
{
. . . .
} while (i==j);

while i<j do
begin
. . . .
end;

while (i<j)
{
. . . .
}

Phn u chng trnh


PASCAL c th c hoc khng c phn u chng trnh:

PASCAL

Khai bo th vin

Program NIM;
Uses crt, matrix;
Khai bo th vin,
tha khng sao!

C++: bt buc phi khai bo cc th vin:


C++
#include <fstream>
#include <iostream>
#include <string>

using namespace std;

10/64

T chc vo ra vi file vn bn
Trong phn khai bo.
Flies t ng c m,

C++

PASCAL

ifstream fi (NIM.INP);
ofstream fo (NIM.OUT);

Const tfi=NIM.INP;
Tfo=NIM.OUT;
Var fi,fo:text;

. . . . . . . .
fi>>a>>b>>c;
fi.close();
. . . . . . . .
fo<<a<< <<b<<endl;
fo<<c;
fo.close();

. . . . . . .
Assign(fi,tfi); reset(fi);
Readln(fi,a,b,c);
Close(fi);
. . . . . . .
Assign(fo,tfo);
Rewrite(fo);
Writeln(fo,a, ,b);
Write(fo,c);
Close(fo);

Chng trnh con v chng trnh chnh


PASCAL
Procedure p1(i,j:integer);
Begin . . .
End;
Procedure p2;
Begin . . .
End;
Function fact(i:integer);integer;
Begin
. . . . . .
fact:=k
End;
. . . . . .
BEGIN
. . . .
END.

11/64

C++
void p1(int i,int j)
{ . . . . }
void p2()
{ . . . . }
int fact(int i)
{ . . .
return(k);
}
. . . . . . .
int main()
{ . . . .
}

V d:

C++

PASCAL
Program NIM;
Const tfi='NIM.INP';
tfo='NIM.OUT';
Var a:array[1..1000] of longint;
i,n,g,t,k:longint;
fi,fo:text;
BEGIN
assign(fi,tfi);
reset(fi);
readln(fi,n);
for i := 1 to n do readln(fi,a[i]);
close(fi);
g:=0;
for i:=1 to n do g:=g xor a[i];
k:=0;
for i:=1 to n do
begin
t:=a[i]-(a[i] xor g);
if t>0 then
begin
inc(k);
a[i]:=t
end
else a[i]:=0
end;
assign(fo,tfo); rewrite(fo);
writeln(fo,k);
X lifxu
k > 0 then
for i:=1 to n do if a[i]>0 then
writeln(fo,i,' ',a[i]);
close(fo)
END.

12/64

#include <fstream>
#include <conio.h>
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{long n,g,t,k;
ifstream fi ("NIM.INP");
ofstream fo ("NIM.OUT");
fi >> n;
{long a[n+1];
for (long i = 1; i <=n;i++)
fi>>a[i];
k=0;
g=0;
for (long i=1; i <=n;i++) g^=a[i];
if (g>0)
{ for (long i=1;i<=n;i++)
{ t = a[i] (a[i]^g);
if (t>0)
{k++;a[i]=t;
} else a[i]=0;
}
}
fo<<k<<endl;
if (k>0)
for (long i= 1; i<=n;i++) if
(a[i]>0) fo<<i << " "<<a[i]<<endl;
fi.close(); fo.close();
}
}

Xu l mt trong cc loi d liu c bn m cc h thng lp trnh u phi


cung cp ch v khai bo, lu tr v x l.
C trong PASCAL v C++ u c 2 loi xu:
Trong PASCAL:
o Xu kiu string (ngn v di),
o Xu kiu Pchar trong h thng lp trnh Free Pascal,
Trong C++:
o Xu dng C,
o Xu dng C++.
Tn ti mt lot cc dch v cung cp cc php x l xu loi 2 v chuyn i
dng biu din xu. Cc dch v ny c t chc trong th vin Strings ca
PASCAL v string ca C++.
string s(ABCD12345abcdABCDE2);
string ns(0123456789);
l=s.size();
k=s.find(BC);
m=s.rfind(BC);
p=s.find_first_of(C);
q=s.find_last_of(C);
i=s.find_first_of(ns);
j=s.find_last_not_of(ns);

// l=s.length(); 19 l
// 1 k (bt u t 0)
// 14 m
// 2 p
// 15 q
// 4 i
// 17 j

13/64

C++
#include <fstream>
#include <string>
#include <iostream>
using namespace std;
int main()
{ string
s=("ABCD12345abcdABCDE2");
string ns=("0123456789");
int l,k,m,p,q,i,j;
ofstream fo ("xl_xau.out");
l=s.size();
k=s.find("BC");
m=s.rfind("BC");
p=s.find_first_of('C');
q=s.find_last_of('C');
i=s.find_first_of(ns);
j=s.find_last_not_of(ns);

XL_XAU.OUT
L
K
M
P
Q
I
J

fo<<"L = "<<l<<endl;
fo<<"K = "<<k<<endl;
fo<<"M = "<<m<<endl;
fo<<"P = "<<p<<endl;
fo<<"Q = "<<q<<endl;
fo<<"I = "<<i<<endl;
fo<<"J = "<<j<<endl;
fo.close();
}

14/64

=
=
=
=
=
=
=

19
1
14
2
15
4
17

PASCAL cng cung cp nhng dch v tng t trong th vin Strings. Di


y l vi v d nu trong ti liu hng dn s dng ca Free Pascal.
PASCAL
Program Example13 ;
Uses s t r i n g s ;
{ Program to demonstrate the StrScan and StrRScan f u n c t i o n s . }
Const P : PChar = This i s a PCHAR s t r i n g . ;

S : Char = s ;
begin
Writeln ( P , s t a r t i n g from f i r s t s : ,StrScan (P, s ) ) ;
Writeln ( P , s t a r t i n g from l a s t s : ,StrRScan (P, s ) ) ;
end .

Find_first v Find_last
PASCAL
Program Example14 ;
Uses s t r i n g s ;
{ Program to demonstrate the StrLower and StrUpper f u n c t i o n s . }
Const P1 : PChar = THIS IS AN UPPERCASE PCHAR STRING ;
P2 : PChar = t h i s i s a lowercase s t r i n g ;
begin
Writeln ( Uppercase : ,StrUpper (P2 ) ) ;
StrLower ( P1 ) ;
Writeln ( Lowercase : ,P1 ) ;
end .

Ch hoa v ch thng
(c cng c tng ng trong C)

15/64

PASCAL
Program Example15 ;
Uses s t r i n g s ;
{ Program to demonstrate the StrPos f u n c t i o n . }
Const P : PChar = This i s a PChar s t r i n g . ;
S : Pchar = i s ;
begin
Writeln ( Pos i t ion of i s i n P : , s i z e i n t ( StrPos (P,S)) - s i z e i n t (P ) ) ;
end .

Tm v tr xu con
Nh vy, vic dng PASCAL hay C++ u c th gii quyt mt cch hiu qu
cc bi ton thi hc sinh gii. Tuy vy, trong mi trng hp, hc sinh cn
c:
Trang b thm cc kin thc mi,
C thi quen khai thc cc cng c trong h thng lp trnh,
Bit cch s dng hp l v c hiu qu cc cng c hin c.
l mt cng dy v hc, ti sao ta khng lm vic ngay vi C++? iu ny
l hon ton kh thi v c li v:
V mt php l:
o B Gio dc cho php s dng C/C++ trong k thi,
o Cng c: cng thuc loi Open Sources (min ph),
V thi gian:
o 02 tit cho vic gii thiu cch vit chng trnh trn C++,
o 02 tit cho vic lm quen vi mi trng lp trnh Dev C++,
o Cc kin thc khc, nu cn, trang b dn trong sut qu trnh bi
dng (theo nguyn tc Ma dm thm t),
Li ch:
o Th vin chun STL ca C++ c nhiu dch v cn thit vi hc
sinh (v d nh cc cng c sp xp theo cc gii thut khc nhau,
cc cng c tm kim, t chc stack, heap, x l vector, ma trn v.
v. . .),
o Ti liu: rt phong ph,
16/64

V mc tiu chin lc lu di:


o Cc kin thc v k nng lp trnh s c tn dng trit trong
tng lai khi hc sinh ln i hc v ra lm vic,
o p ng yu cu v chin lc o to v nng cao cht lng
Gio dc ca nh nc.
Tt nhin PASCAL vi h thng lp trnh Free Pascal vn c s dng song
song nh mt ty chn cho nhng ngi yu thch v vn hon ton c th t
kt qu cao trong cc k thi.
Cc vn cn lu khi chuyn i cng c
Trong thi gian u cn tr gip hc sinh cc vn :

Cc loi li c php thng gp giai on u,


Cch to file d liu,
K thut cc b ha bin,
Khai thc giao din ca Dev C++ v cc cng c hiu chnh,
Vn bin i kiu d liu trong biu thc,
Gii thiu v s tn ti v tc dng ca mt s th vin trong STL.

Trnh trang b dn dp kin thc mi, c bit l v cc th vin. Phong cch


lp trnh theo kiu C++ s t ng c hnh thnh dn theo thi gian, ng vi
tinh thn Trng n rm s trn.
Cc vn ny s c xem xt cc phn tip theo.

17/64

SP XP
Hm sp xp nhanh trn C++
void quickSort(int arr[], int left, int right) {
int i = left, j = right;
int tmp;
int pivot = arr[(left + right) / 2];
/* partition */
while (i <= j) {
while (arr[i] < pivot)
i++;
while (arr[j] > pivot)
j--;
if (i <= j) {
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
i++;
j--;
}
};

12

26

14

Cha sp xp

12

26

14

Gi tr trc = 7

12

26

14

12 7 2 i ch

i
2

26

14

14

Gi tr trc

j
j
12

26 7 7 i ch

26 12

7 7 3 i ch

26 12

i > j - kt thc x l nhm

26

i
7
i
1

/* recursion */
if (left < j)
quickSort(arr, left, j);
if (i < right)
quickSort(arr, i, right);
}

j
3

14

1 2 5 7 3

14

12

X l quy cc nhm

12 14 26

Trong nhiu trng hp thng phi sp xp ng thi 2 dy Ch s CS v Gi


tr B, tc l sp xp cp (csi, bi) theo gi tr tng dn ca bi v vi nhng bi
bng nhau cp (csi, bi) c csi nh hn s ng trc.
SP XP 2 DY
Ta c th d dng b sung m rng hm sp xp nu trn gii quyt vn
ny. Tuy vy, tn dng ti a cc kh nng sp xp khc nhau do h thng
lp trnh cung cp ta cn t chc d liu theo kiu vc t, heap. . . . Chng
trnh sp xp s c dng:
Chng trnh trn C chun:
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
typedef struct
18/64

{
int val, idx; //val: b[i], idx: cs[i]
}Element;
typedef Element Arr[MAX];
int cmpf(const void *a, const void *b);
int main()
{
Arr a = {{5, 4}, {3, 2}, {5, 3}, {5, 1}, {2, 5}};
int n = 5;
qsort(a, n, sizeof(Element), cmpf);
for (int i=0; i<n; i++)
printf("%d %d\n", a[i].val, a[i].idx);
getchar();
}
int cmpf(const void *a, const void *b)
{
return ((((Element *)a)->val - ((Element *)b)->val>0)||
(((Element *)a)->val == ((Element *)b)->val)&&(((Element
*)a)->idx > ((Element *)b)->idx));
}
Chng trnh trn C++:
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
typedef class CElement
{
int val, idx; //val: b[i], idx: cs[i]
public:
CElement(int v=1, int i=1)
{
val = v; idx = i;
}
int GetValue()
{
return val;
}
};
int cmpf(const void *a, const void *b);

19/64

typedef class CArr


{
int n;
CElement data[MAX];
public:
CArr()
{
}
void Sort()
{
qsort(data, n, sizeof(CElement), cmpf);
}
};
int main()
{
CArr a;
//Nhap du lieu cho a
//....
a.Sort();
//...
//Xuat ket qua cua a
system("PAUSE");
return 0;
}
int cmpf(const void *a, const void *b)
{
return (((CElement *)a)->GetValue() - ((CElement *)b)>GetValue());
}
Ghi ch: Ni dung ca phn sp xp v sp xp 2 dy c bin son theo ti liu ca thy
Nguyn Thanh Sn, trng Ph thng Nng khiu , i hc Quc gia Thnh ph H Ch
Minh.

20/64

BI TP V CHNG TRNH
h tr cho vic trin khai ging dy trn C++ cc bi tp di y s c gii thiu km
theo vi li gii trn ngn ng C/C++ v Pascal (da trn c s h thng lp trnh Free
Pascal). Khi c t tin trong vic lp trnh ta s thy li gii a ra di dng chng
trnh hon thin ch c tc dng ch yu to tests.
Vic trnh by gii thut di dng s khi cng khng gip nhiu cho vic nm bt gii
thut m ch h tr cho vic vit chng trnh (coding) c d dng. Ngoi ra, s khi
cn hn ch tnh sng to trong vic trin khai gii thut.
Vi mi bi ton, quan trng v cn thit hn c l gi v gii thut, bao gm:
Hng trin khai gii thut,
Cn c nhng d liu g, t chc nh th no, gi tr u, cch bin i, dn xut,
Nhng im c bit cn lu ,
nh gi phc tp,
Vi mt vi khu x l quan trng: c th dn xut cu lnh hoc on chng trnh.
Vic dn xut y chng trnh cng rt cn thit, nhng ch giai on u ca qu trnh
o to, bi dng hc sinh.
Vic t chc gi gii thut cn mt nhiu thi gian v cng sc hn c vic trc tip vit
chng trnh gii!
Tuyt i trnh cung cp cho hc sinh chng trnh hon thin ngay t u, khi hc sinh
cha hiu gii thut, cha bt tay t mnh lp trnh.
Li gii cho cc bi tp phn u c a ra dng song ng. na cui ca phn bi
tp, khi c kinh nghim vi C++, cc li gii ch a ra dng chng trnh trn C++
hoc C/C++.

21/64

Tn chng trnh: SUBSETS.???

TP CON

Cho 2 tp s nguyn X={x1, x2, . . ., xm} v Y={y1, y2, . . ., yn}, trong :


x1 < x2 < . . . < xm,
y1 < y2 < . . . < yn.
Ni X c th t t in nh hn Y nu tha mn mt trong hai iu kin:
i sao cho x1 = y1, x2 = y2 , . . ., xi-1 = yi-1, xi < yi,
m < n v x1 = y1, x2 = y2 , . . ., xm = ym.
Xt tp s nguyn {1, 2, . . ., n}. T tp ny ngi ta c th trch ra cc tp con, trong mi tp
con cc phn t c lit k theo th t tng dn ca gi tr v sp xp cc tp con nhn c
theo th t t in tng dn. Cc tp con c nh s bt u t 1.
V d, vi n = 3 ta c cc tp con:
1: { 1 }
2: { 1, 2}
3: { 1, 2, 3}
4: { 1, 3 }
5: { 2 }
6: { 2, 3}
7: { 3 }
Yu cu: Cho hai s nguyn n v k (1 < n 60, 1 k 260-1). Hy xc nh tp con th k.
D liu: Vo t file vn bn SUBSETS.INP gm nhiu tets, mi test cho trn mt dng cha
2 s nguyn n v k.
Kt qu: a ra file vn bn SUBSETS.OUT, kt qu mi test a ra trn mt dng cha cc
s nguyn xc nh tp tm c.
V d:
SUBSETS.INP

SUBSETS.OUT

3 2
4 9

1 2

22/64

k--

i =n-1 0
k k-1
1 0 1
2 1 1 2
3 2 1 2 3
4 3 1 3
5 4 2
6 5 2 3
7 6 3

i =n-1 0

Bit th i ca
k t
F

t=0

di = 1
T

di=0

di=1

k=0

a ra i
T

F
k--

C++
#include <fstream>
#include <string>
int n,d[61];
long long k,t,t1=1;;
using namespace std;
ifstream fi ("SUBSETS.INP");
ofstream fo ("SUBSETS.OUT");
void xly()
{ k--;
for (int i=n-1; i>=0;i--)
{ t=(t1<<i)&k;
if ( t==0)
{d[n-i]=1; if (k==0) break;k--;}
else d[n-i]=0;
}
for (int i=1;i<=n;i++) if (d[i]==1) fo<<i<<" ";
fo<<endl;
}
int main()
{ while (! fi.eof())
{ fi>>n>>k;
//if (n==0) break;
xly();
}
fi.close();
fo.close();
}

23/64

Exit

PASCAL
Program SUBSETS;
Const tfi='SUBSETS.INP';
tfo='SUBSETS.OUT';
t1:int64=1;
Var n:integer;
k,t:int64;
d:array[1..60] of byte;
fi,fo:text;
Procedure xly;
var i:integer;
Begin
dec(k);
for i:= n-1 downto 0 do
begin
t:=(t1 shl i) and k;
if t=0 then
begin d[n-i]:=1;
if k = 0 then break; dec(k)
end
else begin d[n-i]:=0; end
end;
for i:=1 to n do if d[i]=1 then write(fo,i,' ');
writeln(fo)
End;
BEGIN
assign(fi,tfi); reset(fi);
assign(fo,tfo); rewrite(fo);
while not eof(fi) do
begin
readln(fi, n, k);
xly
end;
close(fi); close(fo)
END.

24/64

Tn chng trnh: INTERNET.???

INTERNET

Gi truy cp internet ph thuc vo tng thi im trong tun. Cc ngy trong tun c
nh s t 1 n 7 bt u t th 2. Bng tnh gi gm n bn ghi (1 n 100), sp xp theo
th t tng dn ca thi gian, mi bn ghi c dng:

d cc:mm v
trong d l ngy trong tun, cc 2 s ch gi (ch 24 gi), mm 2 s ch pht, v gi
mi pht truy nhp, l s nguyn (1 v 104). Gi truy nhp c gi nguyn cho n khi
gp thi im mi bn ghi tip theo trong bng. Sau bn ghi th n l bng ghi s 1.
Yu cu: Cho bng tnh gi v danh sch xc nh m phin truy nhp mng (1 m 105).
Mi phn t ca danh sch c dng d cc:mm t, trong d, cc, mm c ngha nh trong
bng gi, t thi gian truy nhp tnh theo pht, l s nguyn (1 t 109). Cc phin truy
nhp c th thuc nhng tun khc nhau. Hy tnh chi ph lt mng.
D liu: Vo t file vn bn INTERNET.INP:
Dng u tin cha 2 s nguyn n v m,
Mi dng trong n dng tip theo cha mt bng ghi ca bng gi,
m dng cui cng mi dng cha mt bn ghi v mt phin truy nhp.
Kt qu: a ra file vn bn INTERNET.OUT mt s nguyn chi ph phi tr.
V d:
INTERNET.INP
2 3
1 09:00 500
5 22:00 200
2 22:42 16
5 21:06 57
2 22:50 1

INTERNET.OUT
36100

25/64

C++
#include <fstream>
#include <string>
using namespace std;
long n,m,d,v,t,a[10081];
long long r;
string s;
ifstream fi ("INTERNET.INP");
ofstream fo ("INTERNET.OUT");

void nhap()
{ long i,j;
s.reserve(6);
fi>>d>>s>>v;
i=(s[0]-48)*10+s[1]-48;
j=(s[3]-48)*10+s[4]-48;
t= --d*1440+i*60+j+1;
}
void xd_a()
{
memset(a,0,sizeof(a));
for (int i=1;i<=n; i++)
{ nhap();
a[t]=v;
}
for (int i=1;i<=10080;++i)
{if (a[i]!=0) v=a[i];
a[i]=a[i-1]+v;
}
}
void xd_cf()
{long p,q;
p=v/10080; q=v%10080;
r+=a[10080]*p;
if (t+q>10081){r+= (a[10080]-a[t-1]);q-= (10081-t);t=1;}
r+=(a[t+q-1]-a[t-1]);
}
int main()
{fi>>n>>m;
r=0;
xd_a();
for (int i=1; i <=m; i++)
{nhap();
xd_cf();
}
fo<<r;
fi.close(); fo.close();
}

26/64

PASCAL
Program Internet;
Const tfi = 'INTERNET.INP';
tfo = 'INTERNET.OUT';
Var n,m,d,v,i:integer;
t:longint;
r:int64;
a:array[-1..10079] of longint;
fi,fo:text;
Procedure nhapdl;
var i,j:longint;
s:string[6];
Begin
readln(fi,d,s,v);
dec(d);
i:=(ord(s[2])-48)*10+ord(s[3])-48;
j:=(ord(s[5])-48)*10+ord(s[6])-48;
t:=d*1440+i*60+j
End;
Procedure xd_a;
var i:longint;
Begin
fillchar(a,sizeof(a),0);
for i:=1 to n do
begin
nhapdl;
a[t]:=v;
end;
for i:=0 to 10079 do
begin
if a[i]<>0 then v:=a[i];
a[i]:=a[i-1]+v
end
End;
Procedure xd_cf;
var p,q:longint;
Begin
p:=v div 10080; q:= v mod 10080;
r:=r+a[10079]*p;
if q+t>10080 then
begin r:=r+a[10079]-a[t-1];q:=q-10080+t;t:=0
r:=r+a[q+t-1]-a[t-1]
End;
BEGIN
assign(fi,tfi); reset(fi);
readln(fi,n,m);
xd_a; r:=0;
for i:= 1 to m do
begin
nhapdl;
xd_cf
end;
assign(fo,tfo); rewrite(fo);
write(fo,r);
close(fi); close(fo)
END.

27/64

end;

Tn chng trnh: WHEEL.???

BNH XE MAY MN

Hi cn b Steve c tng mt chi gi l bnh xe may mn. l mt ci a c th quay theo


chiu kim ng h. Vnh ca a c chia thnh n phn bng nhau, trn mi phn c th ghi mt
ch ci latinh in hoa. Bn ngoi c mt kim ch n ch ci
khi bnh xe dng. Thit k chi m bo kim khng
N
bao gi ch ng vo vch phn chia. C mi ln kim chm
O
vo vch phn chia li c mt ting chung rt m tai v b
m s ting chung tm bnh xe li tng thm 1. bt
u quay bnh xe ngi ta phi lc nh n ri mi quay c
v khi lc b m tr v 0.
Steve rt thch th v chi rt nhiu ln. Steve khng bao gi
ghi cc ch ci trng nhau trn vnh bnh xe.
Thng thng, vi mt b cc ch ci ghi trn vnh bnh xe
Steve chi k ln lin tip, sau mi ln quay Steve ghi li s
hin th tm v ch ci m mi tn ch ti.
iu din ra lu lm ri. Cy ci trong cng vin thnh
ph nhiu ln thay l. Chic chi xinh xn tht lc u . Mt ln tnh c Steve tm thy
mnh giy c ghi li kt qu chi. Nhng k nim p ca thi th u m du, v t l cht tro ln
nh nhng t sng lng v Steve khng cng ni ngh phi khi phc li dng ch vit trn
bnh xe. Tuy vy, cng khng loi tr kh nng do vi vng, kt qu b ghi sai (ai m ng c
mu giy ny li c gi tr nh vy trong tng lai!) do khng xc nh c nhng g ghi trn
bnh xe. Ngoi ra, kt qu ln chi ny cng c th kh ngho nn, khng thng tin xc nh
ht cc ch ci ghi trn bnh xe.
Yu cu: Cho n, k v cc gi tr mi, ci, trong mi l s ghi c lt quay th i, ci k t kim
ch lt quay ny (2 n 25, 1 k 100, i = 1 k). Hy xc nh dng ch ghi trn vnh bnh
xe k t k t ln cui cng c kim ch ti. Nu thng tin mu thun th a raxu ch cha mt k
t !. Nu mt s k t khng thng tin xc nh th vo v tr trong xu a ra k t ?.
D liu: Vo t file vn bn WHEEL.INP:
Dng u tin cha 2 s nguyn n v k,
Dng th i trong k dng sau cha 2 gi tr mi v ci.
Kt qu: a ra file vn bn WHEEL.OUT xu xc nh c.
V d:

WHEEL.OUT
HONITAVR

8
V
I
T
A
R
N
O
H

28/64

WHEEL.INP
8
4
3
7
7
6
5
1
9

C++
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
string s,s2;
char c;
long n,k,m,fl,v;
ifstream fi ("WHEEL.INP"); ofstream fo ("WHEEL.OUT");
void chbi()
{
fi>>n>>k;
s=""; fl=0;v=n-1;
for (int i = 0; i<n; i++) s+='?';
}
void xldong()
{ fi>>m>>s2;
c=s2[0];
m%=n;
v-=m;
if (v<0) v+=n;
if (s[v]=='?') s[v]=s2[0];
else
if (s[v]!= c) {fl=1; return;}
}
void gnkq()
{ int i;
if (fl==1) s='!';
else
{i=s.find(c); s+=s;
s=s.substr(i,n);
}
fo <<s;
}
int main()
{
chbi();
for (int i=0; i<k; i++) xldong();
gnkq();
fi.close(); fo.close();
}

29/64

PASCAL
Program WHEEL;
Const tfi = 'WHEEL.INP';
tfo = 'WHEEL.OUT';
Var n,k,m,i,err,v:integer;
c0,c:char;
s:string[50];
fi,fo:text;
BEGIN
assign(fi,tfi); reset(fi);
readln(fi,n,k);
s:=''; err:=0; v:=n;
for i:= 1 to n do s:=s+'?';
for i:=1 to k do
begin
readln(fi,m,c0,c);
v:=v-m; if v<=0 then v:=v+n;
if ((s[v]<>'?') and (s[v]<>c)) then
begin err:=1; s:='!'; break end;
s[v]:=c
end;
assign(fo,tfo); rewrite(fo);
if err=0 then
begin s:=s+s; s:=copy(s,v,n) end;
write(fo,s);
close(fi); close(fo)
END.

30/64

Tn chng trnh: GUITAR.???

GHI TA

Trong cuc thi sng to r bt Steve trnh din r bt chi ghi ta ca mnh, mt r bt,
theo li m t ca tc gi c n hng t ngn tay!
n ghi ta c 6 dy nh s t 1 n 6 v c p phm nh s t
1 n p. Khi chi nhc ngi ta gy dy v bm phm c cc
giai iu khc nhau. Vi mi dy, nu c nhiu phm cng
c bm th m iu s c quyt nh bi phm c s cao
nht. V d, m iu khi gy dy s 3 v bm ng thi cc
phm 5 v 7 s ging nh khi ta gy dy ny v ch bm phm
s 7.
iu kh khn nht khi biu din mt bi nhc l iu khin
cng tc phi gy dy no v bm phm no, cn iu
khin trng (thi gian pht mt nt) khng phi l qu kh
v phng din k thut. Chng trnh iu khin cng
ca Steve c ti u ha theo hng gim s ln chuyn tay
bm phm xung cn t nht.
Xt bn nhc c n nt, nt th i c cho bi cp gi tr
nguyn (si, fi), trong si dy cn gy v fi phm cn
bm (1 si 6, 1 fi p, i = 1 n). Bn nhc cn chi
theo trnh t thc hin ln lt t nt 1 n nt n. V d, vi n
= 5, p = 15 v bn nhc l (2, 8), (2, 10), (2, 12), (2, 10) v
(2,5), thao tc bm phm ca r bt l bm phm 8, bm phm
10, bm phm 12, nh phm 12, nh phm 10, nh phm 8 v
bm phm 5, tt c l 7 thao tc, thc hin trn dy s 2.
Yu cu: Cho n, p v cc si, fi (1 n 5105, 2 p 3105, i = 1 n). Hy xc nh s

thao tc bm phm t nht cn thc hin.


D liu: Vo t file vn bn GUITAR.INP:

Dng u tin cha 2 s nguyn n v p,

Dng th i trong n dng sau cha 2 s nguyn si v fi.

Kt qu: a ra file vn bn GUITAR.OUT mt s nguyn s thao tc bm phm t nht

cn thc hin.
V d:

5
2
2
2
2
2

GUITAR.INP
15
8
10
12
10
5

GUITAR.OUT
7

e11 Cr7 3

31/64

C++
#include <fstream>
using namespace std;
int main()
{long n,p,s,f,k,r;
ifstream fi ("GUITAR.INP");
ofstream fo ("GUITAR.OUT");
fi>>n>>p;
{long a[6][p];
for (int i=0; i<6;i++) a[i][0]=0;
r=0; k=0;
for (int i=1; i<=n;i++)
{ fi>>s>>f; --s;
while (a[s][k]>f)
{ --k; ++r;}
if (a[s][k]<f) { ++k; a[s][k]=f; ++r;}
}
}
fo<<r;
fi.close(); fo.close();
}

PASCAL
Program GUITAR;
Const tfi='GUITAR.INP';
tfo='GUITAR.OUT';
var m,n,p,k,s,f,i,r:longint;
a:array[1..6,0..300000] of integer;
fi,fo:text;
BEGIN
assign(fi,tfi); reset(fi);
readln(fi,n,p);
r:=0; k:=0;
for i:=1 to 6 do a[i,0]:=0;
for i :=1 to n do
begin
readln(fi,s,f);
while a[s,k]>f do begin dec(k); inc(r) end;
if a[s,k]<f then begin inc(k);a[s,k]:=f; inc(r)
end
end;
assign(fo,tfo); rewrite(fo);
writeln(fo,r);
close(fi); close(fo)
END.

32/64

Tn chng trnh: YELLOW.???

MU VNG

Phng ng ca Gholam c lt bng cc vin gch men vung mu vng v trng k ca r.


Mi khi bun chn Gholam ng mt vin gch mu trng no , quay mt sang phi
hoc sang tri, ngh trong u mt s nguyn n ri i thng theo hng n bc, mi bc
Gholam chuyn sang vin gch k
cng hng, nu chm tng th quay
1800 v tip tc thc hin cc bc i,
va i va m s ln mnh t chn
ln vin gch mu vng. Cc vin
gch trong hng m Gholam ng
c nh s t 1 n m t tri qua
phi. V d, m = 6, mu cc vin gch t tri qua phi l Y, W, W, Y, W, Y (Y mu vng, W
mu trng), Gholam ng vin gch s 3, i 7 bc vi hng ban u l sang phi, trong
trng hp ny Gholam s dng li vin s 2 v c 3 ln bc ln vin gch mu vng.
D liu: Vo t file vn bn YELLOW.INP:
Dng u tin cha s nguyn t s lng tests trong file,
Mi test cho trn 2 dng:
o Dng u tin cha 2 s nguyn m v n (3 m 100, 1 n 1 000),
o Dng th 2 cha m s nguyn a1, a2, . . ., am, ai = 0 ng vi vin mu vng,
ai > 0 ng vi vin mu trng, ai = 2 c ngha l Gholam ang ng vin
th i v quay mt v bn phi (nhn xung cui hng), ai = 3 xc nh
Gholam ang ng vin th i v quay mt v bn tri (nhn v u hng
ghch). D liu m bo ch c mt ai > 1.
Kt qu: a ra file vn bn YELLOW.OUT, kt qu mi test a ra trn mt dng di
dng s nguyn s ln bc trn vin gch mu vng.
V d:
YELLOW.INP
2
6
0
5
0

YELLOW.OUT
3
1

7
1 2 0 1 0
3
3 1 0 0

33/64

C++
#include <fstream>
using namespace std;
ifstream fi ("yellow.inp");
ofstream fo ("yellow.out");
int r;
void xly()
{int m,n,r,t0,t1,d,id,m2,p,q;
fi>>m>>n;
{int a[3*m-2];
t0=0;t1=0;m2=2*m-2;
for (int i=m-1;i<2*m-1;i++)
{fi>>a[i];
switch (a[i])
{case 0: t0++; break;
case 1: t1++; break;
case 2:case 3: d=a[i]; id=i; a[i]=0;break;
}
}
for (int i=0;i<m-1;i++) a[i]=a[2*m-2-i];
for (int i=0;i<m-1;i++) a[i+2*m-1]=a[2*m-3-i];
t1*=2; t-=(a[m-1]+a[2*m-2]);
p=n/m2; q=n%m2;
r=t1*p;
if (d==2) for(int i=1; i<=q;i++) r+=a[i+id];
else for (int i=1;i<=q;i++) r+=a[id-i];
fo<<r<<endl;
}
}
int main()
{int t;
fi>>t;
for (int i =1;i<=t;i++) xly();
fi.close(); fo.close();
}

34/64

PASCAL
Program YELLOW;
Const tfi='YELLOW.INP';
tfo='YELLOW.OUT';
var t,m,n,p,q,t1,m2,i,r,d,id:longint;
a:array[-99..199] of integer;
fi,fo:text;
Procedure xly;
var i:integer;
Begin
readln(fi,m,n); t1:=0; m2:=2*m-2;
for i:=1 to m do
begin
read(fi,a[i]);
case a[i] of
1:inc(t1);
2,3:begin id:=i;d:=a[i];a[i]:=0 end
end
end;
for i:=2 to m do a[2-i]:=a[i];
for i:=2 to m do a[m+i-1]:= a[m-i+1];
t1:=t1*2-a[1]-a[m];
p:=n div m2; q:=n mod m2;
r:=t1*p;
if d=2 then for i:=id to id+q do r:=r+a[i]
else for i:=id downto id-q do r:=r+a[i];
writeln(fo,r)
End;

35/64

Tn chng trnh: TV.???

TI VI

Ngi ta tin hnh iu tra thng k tnh hnh xem ti vi trong dn chng. Mi ngi trong s
n ngi c hi yu cu cho bit thi im ngi ta bt u xem ti vi v thi im m ht
cui giy ngi ta ri khi ti vi. Cu tr li c ghi li di dng:
Thi im bt u

Thi im cui

HH:MM:SS HH:MM:SS
Trong 0 HH 23, 0 MM, SS 59. Hai thi im u v cui c th khng cng mt
ngy, v d, mt ngi c th bt u xem t 23:45:30 cho n 01:15:00 sng ngy hm sau.
D nhin, khng ai xem ti vi lin tc c mt ngy.
Sau khi c d liu, cc nh thng k bt u phn tch.
ph bin ca mt giy no c tnh bng tng s ngi c xem ti vi giy .
ph bin ca mt khong thi gian c tnh bng tng ph bin ca cc giy trong
khong chia cho tng s giy trong khong.
Hy tnh ph bin ca mi khong trong s q khong cho trc m cc nh thng k quan
tm.
D liu: Vo t file vn bn TV.INP:

Dng u tin cha s nguyn n (1 n 105),


Mi dng trong n dng sau cha mt cu tr li ca ngi c hi,
Dng th n+2 cha s nguyn q (1 q 105),
Mi dng trong q dng sau cha mt khong thi gian thng k, ghi theo quy cch
nh cu tr li khi iu tra.

Kt qu: a ra file vn bn TV.OUT, kt qu ng vi mi khong thng k a ra trn mt


dng di dng s thc chnh xc khng t hn 10-6.
V d:
TV.INP
5
00:00:00 - 00:00:01
00:00:01 - 00:00:03
00:00:00 - 00:00:02
00:00:05 - 00:00:09
00:00:06 - 00:00:06
5
00:00:00 - 00:00:03
00:00:07 - 00:00:09
00:00:06 - 00:00:06
00:00:05 - 00:00:09
00:00:00 - 00:00:09

TV.OUT
2.0000000000
1.0000000000
2.0000000000
1.2000000000
1.4000000000

e25 Cr11 2

C++
36/64

#include <fstream>
#include <string>
#include <iomanip>
using namespace std;
long n,q,b[86400],tb,te;
string s;
ifstream fi ("TV.INP");
ofstream fo ("TV.OUT");
void nhapdl()
{ s.reserve(19);
getline(fi,s);
tb=(((s[0]-48)*10+s[1]-48)*60+(s[3]-48)*10+s[4]-48)*60+(s[6]48)*10+s[7]-48;
te=(((s[11]-48)*10+s[12]-48)*60+(s[14]-48)*10+s[15]-48)*60+(s[17]48)*10+s[18]-48;
}
void gn_be()
{b[tb]++;
if (te==86399) return;
if (te<tb)b[0]++;
b[++te]--;
}
void tichluy()
{long t;
t=b[0];
for (int i=1;i<86400;i++)
{ t+=b[i];
b[i]=(b[i-1]+t);
}
}
float xd_r()
{ float x;
x=b[te];
if (tb==0) return(x);
if (tb<=te) return(x-b[tb-1]);
return(x+b[86399]-b[tb-1]);
}
void xd_kq()
{float r,d;
if (tb>te) d=86400-tb+te+1; else d=te-tb+1;
r= xd_r()/d;
fo<<setprecision(8)<<r<<endl;
}
int main()
{memset(b,0,sizeof(b));
fi>>n; getline(fi,s);
for (int i=1;i<=n;i++)
{nhapdl();
gn_be();
}
tichluy();
fi>>q; getline(fi,s);

37/64

for (int i=1;i<=q;i++)


{nhapdl();
xd_kq();
}
fi.close(); fo.close();
}

NG GP KHC

Tn chng trnh: POLYGON.???

Trn li vung v hn vi ta cc nh nt l nguyn ngi ta cho mt ng gp khc


n khp kn n nh, tc l ng gp khc m 2 cnh lin tip ch c mt im chung
nh, mt cnh khng ct cc cnh khc v cng
khng c im chung no khc. nh ca ng gp
khc trng vi im chia ca li.
Hy tnh tng di cc on thng ca li nm gn
trong a gic gii hn bi ng gp khc.
D liu: Vo t file vn bn POLYGON.INP:
Dng u tin cha s nguyn n (3 n
105),
Dng th i trong n dng sau cha 2 s nguyn
xi v yi ta nh i (|xi|, |yi| 5108).
Ta cc nh cho theo mt chiu no
(cng hoc ngc chiu kim ng h).
Kt qu: a ra file vn bn POLYGON.OUT mt s
thc L tng di tm c. Gi R l di chnh
xc. Kt qu c coi l ng nu tha mn mt trong 2 iu kin sau:
|L-R| R10-6 (sai s tng i),
|L-R| 10-6 (sai s tuyt i).

V d:
POLYGON.INP
5
0 0
-2 2
-2 -1
2 -2
2 0

POLYGON.OUT
12.5

38/64

Gii thut
a gic c th chia thnh cc hnh thang c cnh song song vi trc Oy, chiu cao bng 1 (c
th c hnh thang suy bin thnh tam gic),
Cc on thng ca li, song song vi trc Oy v nm gn trong a gic, tham gia vo qu
trnh tnh din tch 2 ln: mt ln l
y di v ln khc - l y trn.
Cc on thng ca li, song song
vi trc Oy v nm ng bin
tham gia mt ln.
C nhn xt tng t nh vy vi cc
on ca li, song song vi trc Ox
v nm gn trong a gic.
Gi S l din tch a gic, lv tng
di cc on bin song song vi
Oy, lh tng di cc on bin song song vi Ox, r l kt qu cn tm,ta c:

2r = s
trong s =

lv
lh
+s ,
2
2

1 n
| ( xi yi 1 xi 1 yi ) | , xi+1 = x1, yi+1 = y1.
2 i 1

39/64

C++
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
int n, lh = 0, lv = 0, S = 0, x[100100],
y[100100];
ifstream fi ("POLYGON.INP");
ofstream fo ("POLYGON.OUT");
void input(){
fi>>n;
for (int i = 1; i <= n; i++) fi>>x[i]>>y[i];
x[n+1] = x[1];
y[n+1] = y[1];
}
void cal_area(){
for (int i = 1; i <= n; i++)
S += x[i]*y[i+1] - y[i]*x[i+1];
S = abs(S);
}
void cal_lh_lv(){
for (int i = 1; i <= n; i++){
if (x[i] == x[i+1])
lv += abs(y[i+1] - y[i]);
if (y[i] == y[i+1])
lh += abs(x[i+1] - x[i]);
}
}
void output(){
fo << double(2*abs(S) - lv - lh) / double(2);
}
int main(){
input();
cal_area();
cal_lh_lv();
output();
return 0;
}

40/64

C++
Vo ra theo quy cch
#include <iostream>
#include <cmath>
using namespace std;
int n, lh = 0, lv = 0, S = 0, x[100100], y[100100];
void input(){
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d %d", &x[i], &y[i]);
x[n+1] = x[1];
y[n+1] = y[1];
}
void cal_area(){
for (int i = 1; i <= n; i++)
S += x[i]*y[i+1] - y[i]*x[i+1];
S = abs(S);
}
void cal_lh_lv(){
for (int i = 1; i <= n; i++){
if (x[i] == x[i+1])
lv += abs(y[i+1] - y[i]);
if (y[i] == y[i+1])
lh += abs(x[i+1] - x[i]);
}
}
void output(){
cout << double(2*abs(S) - lv - lh) / double(2);
}
int main(){
freopen("POLYGON.INP", "r", stdin);
freopen("POLYGON.OUT", "w" ,stdout);
input();
cal_area();
cal_lh_lv();
output();
return 0;
}

41/64

Tn chng trnh: PLAGIARY.???

QUAY CP

Th sinh tham d Thi lp trnh th gii np n files li gii f1, f2, . . ., fn. Trc khi chm
Ban Gim kho quyt nh kim tra xem c trng hp chp bi ca nhau khng. Ngi ta
ly tng cp 2 files, so snh ni dung xem chng c qu ging nhau hay khng.
Nhng s lng files l rt ln v khng thi gian so snh tt c cc cp files. V vy,
ngi ta ch so snh cc file c kch thc gn nhau.
C th l, nu vi 2 files, kch thc file b nh hn 90% kch thc file ln th s khng s
snh chng. Ni mt cch khc, gi di l kch thc file fi, ngi ta s so snh 2 files fi v
fj nu di dj, di 0.9dj, i j.
Hy xc nh s lng cp files cn so snh.
D liu: Vo t file vn bn PLAGIARY.INP:
Dng u tin cha s nguyn n (1 n 105),
Dng th 2 cha n s nguyn d1, d2, . . ., dn (1 di 108 , i = 1 n).
Kt qu: a ra file vn bn PLAGIARY.OUT mt s nguyn s lng cp files cn so
snh.
V d:
PLAGIARY.INP
5
1 1 1 1 1

PLAGIARY.OUT
10

Gii thut

Sp xp {di} theo th t tng dn ca gi tr,


Vi mi i t 1 n n-1 tm k = max{j: j>=i, di 0.9dj},
Nu vi i c k, vi i+1 ch cn tm tip t k+1 tr i,
Vi mi i kt qu tng ln mt lng l k i.

phc tp: O(nlogn).

42/64

C++
#include <iostream>
#include <ctime>
using namespace std;
int n, up, res = 0, a[100100];
int main(){
freopen("PLAGIARY.INP", "r", stdin);
freopen("PLAGIARY.OUT", "w", stdout);
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
sort(a, a+n);
a[n] = INT_MAX;
for (int i = 0; i < n; i++){
int j = min(n - 1, up);
while (j < n && 9*a[j] <= 10*a[i])
j++;
up = j;
res += j-i-1;
}
printf("%d", res);
return 0;
}

43/64

Tn chng trnh: DUMB_BELL.???

C T

Rn luyn th lc bng cch tp nng t thu ht c s ch ca rt nhiu bn tr. T l


mt thanh trc c gn hai u cc a t. B a t trong phng tp bao gm cc loi 1kg,
2kg, 5kg, 10kg, 15kg v 20kg vi s lng mi loi l nhiu. Cc a t hai u thanh
c gn i xng m bo thanh t c cn. Mi ngi, ty theo th lc ca mnh, lp
cc a t c trng lng ph hp. iu chnh trng lng, ngi ta tho cc a ngoi
cng, lp cc a mi vo. Do tnh i xng ca
thanh t, ta ch xt cc thao tc iu chnh mt
20
u.
2 2

Hin ti mt u ang c n a t gn vo trc (1


n 10), tnh t trong ra ngoi a th i c trng
lng pi. Bn cn c thanh t vi trng lng mt
u l w (0 w 100). V d, hin ti n = 4 v cc
a t l (2, 2, 1, 20), bn cn iu ch trng lng
thnh 14kg. Bn s phi thc hin 3 thao tc tho
lp: tho a 20kg, tho a 1kg v lp a 10kg.
Yu cu: Cho n, pi, i=1 n, w. Hy xc nh s thao tc t nht cn thc hin.
D liu: Vo t file vn bn DUMB_BELL.INP:
Dng u tin cha s nguyn n,
Dng th 2 cha n s nguyn p1, p2, . . ., pn,
Dng th 3 cha s nguyn w.
Kt qu: a ra file vn bn DUMB_BELL.OUT mt s nguyn s thao tc t nht cn
thc hin.
V d:
DUMB_BELL.INP

DUMB_BELL.OUT

4
2 2 1 20
14

44/64

C++
#include <iostream>
using namespace std;
const int b[6] = {1, 2, 5, 10, 15, 20};
int n, w, p, F, res = INT_MAX, s[11], L[201];
int main(){
freopen("DUMB_BELL.INP", "r", stdin);
freopen("DUMB_BELL.OUT", "w", stdout);
scanf("%d", &n);
for (int i = 1; i <= n; i++){
scanf("%d", &p);
s[i] = s[i-1] + p;
}
scanf("%d", &w);
L[1] = L[2] = L[5] = L[10] = L[15] = L[20] = 1;
for (int i = 1; i <= 200; i++){
if (L[i] == 1)
continue;
L[i] = INT_MAX;
for (int j = 0; j < 6 && b[j] < i; j++)
L[i] = min(L[i], L[i - b[j]] + 1);
}
for (int i = 0; i <= n; i++){
F = n-i;
if (s[i] > w)
F = INT_MAX;
else if (s[i] < w)
F += L[w - s[i]];
res = min(res, F);
}
printf("%d", res);
return 0;
}

45/64

TA VNG

Tn chng trnh: REG_COOR.???

mau chng tm kim c cc vng v cung cp bn tng ng cho ngi dng


Google Map p dng c ch cy t phn. Bn ton b tri t l t, c coi nh mt hnh
vung. Bng cc ng thng song song vi cnh v i qua im gia ca cnh, bn ban
u c chia thnh 4 phn bng nhau, mi phn bng bn ban u v k hiu cc phn
l t, s, r, q theo chiu ngc kim ng h, bt u t phn di tri. ng dn truy
nhp ti cc phn ny s l tt, ts, tr v tq. Mi phn nhn c li c th chia thnh 4
phn con, nh s nh trn, ng dn ti phn con ny s c di 3 v c nh th tip tc
cho n khi t c mc tiu tm kim. V d, ng dn ti bn Vit Nam l trst.

Xt bn s hnh vung ta gc di tri l (0, 0), gc trn phi l (2n, 2n) vi 0 < n
1000. Vi im P ta (x,y) (0 < x, y < 2n ta c th ch ra
ng dn ti vng nh nht cha P nh mt im trong
(khng nm trn bin). V d, vi P c ta (5, 3) v n = 3,
tq
tr
vng nh nht cha P c ng dn l tsq.
Yu cu: Cho n, x, y. Hy xc nh ng n ti vng cha
im (x, y).
D liu: Vo t file vn bn REG_COOR.INP gm mt dng
cha 3 s nguyn n, x v y.
Kt qu: a ra file vn bn REG_COOR.OUT xu ng
dn.
V d:
REG_COOR.INP
3 5 3

REG_COOR.OUT
tsq

46/64

tsq

tt

C++
#include <iostream>
#include <string>
using namespace std;
int n;
string x, y, res;
string div(string a, int b){
int hold = 0, s = 0;
string ans = "";
for (int i = 0; i < a.size(); i++){
hold = 10 * hold + (a[i] - '0');
s = hold / b;
hold %= b;
ans += ('0' + s);
}
while (ans[0] == '0')
ans.erase(0, 1);
return ans;
}
string binary_representation(string a){
string ans = "";
while (a.size()){
ans += ('0' + (a[a.size()-1] - '0') %
2);
a = div(a, 2);
}
for (int i = 0; i < (ans.size() >> 1); i++)
swap(ans[i], ans[ans.size()-i-1]);
while (ans.size() < n)
ans.insert(0, "0");
return ans;
}
int main(){
freopen("REG_COOR.INP", "r", stdin);
freopen("REG_COOR.OUT", "w", stdout);
cin >> n >> x >> y;
x = binary_representation(x);
y = binary_representation(y);
res = "";
for (int i = 0; i < n-1; i++){
if (x[i] == '0' && y[i] == '0')
res += 't';
else if (x[i] == '0' && y[i] == '1')
res += 'q';
else if (x[i] == '1' && y[i] == '0')
res += 's';
else if (x[i] == '1' && y[i] == '1')
res += 'r';
if (min(x.rfind("1"), y.rfind("1")) < i-1)
break;
}
cout << "t" << res;
return 0;
}

47/64

Tn chng trnh: CLAN.???

B TC

C mt hn o rt p, thu ht nhiu khch du lch gh thm. Trn o c n ngi thuc


nhiu b tc sinh sng. Dn c trn o rt thn thin. Mi ngi thuc mt b tc no .
Trong on du lch c mt nh nhn chng hc. Tranh th dp may c gh thm o ng
khng b ph thi gian tin hnh kho st. ng gp tng ngi mt trn o vi mt cu hi
duy nht: Trn o, b tc ca bn c bao nhiu ngi?. T kt qu kho st, ng xc
nh c s b tc khc nhau tn ti trn o.
V d, vi n = 10 v cc cu tr li l 5, 1, 2, 5, 5, 2, 5, 5, 2, 2 ta c th suy ra l trn hn o
c 4 b tc khc nhau.
Yu cu: Cho n v cc cu tr li. Hy xc nh s b tc trn o. D liu m bo bi ton
c nghim.
D liu: Vo t file vn bn CLAN.INP:
Dng u tin cha s nguyn n (1 n 105),
Mi dng trong n dng sau cha mt s nguyn cu tr li nhn c.
Kt qu: a ra file vn bn CLAN.OUT mt s nguyn s b tc trn o.
V d:
CLAN.INP
10
5
1
2
5
5
2
5
5
2
2

CLAN.OUT
4

C++
#include <fstream>
#include <set>
using namespace std;
int n, ans, res = 0;
set <int> a;
multiset <int> s;
int main(){
ifstream finp ("CLAN.INP");
ofstream fout ("CLAN.OUT");
finp >> n;
while (n--){
finp >> ans;
a.insert(ans);
s.insert(ans);
}
for (set <int>::iterator i = a.begin(); i !=
a.end(); i++)
res += s.count(*i) / (*i);
fout << res;
}

48/64

Tn chng trnh: INFECT.???

LY NHIM

Steve pht hin ra mt li trong h iu hnh ni ting ang c s dng ph bin. Li dng
li ny ta c th truy nhp v iu khin my tnh bt k ang kt ni v s dng h iu
hnh ny. Khi kch hot c ch to li, nu mt my tnh ang c kt ni vi ng 8 my
tnh khc ta c mt con ng ring tuy nhp vo n trong ng 8 giy.
Steve vit mt chng trnh virus n gin khai thc li ny. Virus hot ng theo kiu tun
t, ngha l my tnh b nhim virus mi thi im ch tn cng sang ng mt my khc
m thi.
Yu cu: Ban u Steve c 8 my b nhim virus. Hy xc nh sau bao lu virus s lan
c ti tt c n my tnh ca Steve.
D liu: Vo t file vn bn INFECT.INP gm mt dng cha s nguyn n (8 n 108).
Kt qu: a ra file vn bn INFECT.OUT mt s nguyn thi gian cn thit cc my
u b nhim virus.
V d2:
INFECT. INP

INFECT. OUT

20

80

C++
#include <fstream>
using namespace std;
int n, cur = 8, res = 0;
int main(){
ifstream finp ("INFECT.INP");
ofstream fout ("INFECT.OUT");
finp >> n;
while (cur < n){
cur += (cur / 8);
res += 8;
}
fout << res;
return 0;
}

49/64

Tn chng trnh: PASSW.???

MT KHU

c c mt mt khu c an ton cao cn phi kho lo trong cch chn. Ngi ta


thng hay dng cc mt khu n gin, d nh. Nhng nhng mt khu khng c an
ton cao. Cn phi c mt chin lc chn mt khu.
Xt chin lc chn mt khu sau:
Mt khu phi c di t nht 6 k t,
Trong mt khu phi bao gm cc k t 3 loi:
o Ch ci latinh in hoa,
o Ch ci latinh thng,
o Ch s h 10.
Yu cu: Cho xu S di khng qu 105 v ch cha cc k t thuc 3 loi d nu

trn.Hy xc nh di ca xu con ngn nht cc k t lin tip nhau c th s dng lm


mt khu theo chin lc nu. Nu khng tn ti xu con tha mn th a ra kt qu
di 0.
D liu: Vo t file vn bn PASSW.INP:

Dng u tin cha s nguyn n s lng tests (1 n 50),


Mi dng trong n dng sau cha mt xu S.

Kt qu: a ra file vn bn PASSW.OUT n s nguyn, mi s trn mt dng, dng i tng

ng vi kt qu test th i.
V d:

PASSW.INP

PASSW.OUT

4
AliKam123test
AbCdEfG
88syadneerG
Windows7released21october2009

50/64

6
0
10
8

C++
#include <fstream>
#include <string>
using namespace std;
int n;
int main(){
ifstream finp ("PASSW.INP");
ofstream fout ("PASSW.OUT");
finp >> n;
while (n--){
string s;
finp >> s;
if (s.size() < 6){
fout << "0" << endl;
continue;
}
int upper = -1 , lower = -1, num = -1, res = INT_MAX;
for (int i = 0; i <= s.size(); i++){
if ('A' <= s[i] && s[i] <= 'Z')
upper = i;
else if ('a' <= s[i] && s[i] <= 'z')
lower = i;
else if ('0' <= s[i] && s[i] <= '9')
num = i;
if (upper >= 0 && lower >= 0 && num >=0)
res = min(res, i - min(min(upper, lower), num) + 1);
}
if (upper == -1 || lower == -1 || num == -1)
fout << "0" << endl;
else
fout << max(res, 6) << endl;
}
return 0;
}

51/64

TR GIP NG NHP

Tn chng trnh: F1LOGIN.???

Cui cng th mt h thng chm im mi cng c a vo s dng. Mt khu truy


cp phi khc rng, c di khng qu 10 k t bao gm ch s, ch ci la tinh thng v
hoa. M un ng nhp, ngoi vic kim tra mt khu cn gip ngi s dng pht hin hai
loi sai st thng gp:
t ch phm CAPLOCK ch ON, khi ch hoa c th thnh ch thng v
ngc li,
t phm NUMLOCK ch OFF, khi cc k t s s b b qua.
Chng trnh s so snh mt khu ng k vi mt khu nhp vo. Nu 2 mt khu trng
khp vi nhau th a ra thng bo Login successful.. Nu mt khu nhp vo,
thy mi ch ci hoa thnh ch ci thng tng ng v thay mi ch ci thng thnh ch
ci hoa tng ng s c mt khu ng, khi chng trnh a ra thng bo Wrong
password. Please, check your caps lock key. Nu trong mt khu h
thng lu tr b tt c cc k t s, kt qu trng khp vi xu ngi s dng nhp th a ra
thng bo Wrong password. Please, check your num lock key. Nu
trong mt khu h thng lu tr b tt c cc k t s v i ch hoa thnh ch thng, ch
thng thnh ch hoa, kt qu trng khp vi xu ngi s dng nhp th a ra thng bo
Wrong password. Please, check your caps lock and num lock
key. Trong cc trng hp cn li a ra thng bo Wrong password..
D liu: Vo t file vn bn F1LOGIN.INP:
Dng u tin cha s nguyn t s lng tests,
Mi dng trong t dng tip theo cha s xu cch nhau bi du cch: mt khu lu tr
v mt khu nhp vo.
Kt qu: a ra file vn bn F1LOGIN.OUT cc thng bo tng ng vi tng cp mt
khu, mi thng bo trn mt dng.
V d:
F1LOGIN.INP
6
aaBBccDD
aaBBccDD
aaBBccDD
aaBBccDD
a4B3c2D1
a4B3c2D1

aaBBccDD
aaBBccDD9
aaBBCCDD
AAbbCCdd
aBcD
AbCd

F1LOGIN.OUT
Login successful
Wrong password.
Wrong password.
Wrong password. Please, check your caps lock key.
Wrong password. Please, check your num lock key.
Wrong password. Please, check your caps lock and num lock key.

52/64

C++
#include <iostream>
#include <string>
using namespace std;
int n;
int main(){
freopen("F1LOGIN.INP", "r", stdin);
freopen("F1LOGIN.OUT", "w", stdout);
cin >> n;
while (n--){
string s,t;
cin >> s >> t;
if (s.compare(t) == 0){
cout << "Login successful. " << endl;
continue;
}
cout << "Wrong password. ";
string ss = s, tt = t;
bool stop;
while (true){
stop = true;
for (int i = 0; i < ss.size(); i++)
if ('0' <= ss[i] && ss[i] <= '9'){
ss.erase(i, 1);
stop = false;
}
if (stop)
break;
}
for (int i = 0; i < tt.size(); i++)
if ('a' <= tt[i] && tt[i] <= 'z')
tt[i] -= ('a' - 'A');
else if ('A' <= tt[i] && tt[i] <= 'Z')
tt[i] += ('a' - 'A');
bool cap = ((s.compare(tt) == 0) || (ss.compare(tt) == 0)),
num = (ss.size() < s.size() && ((ss.compare(t) == 0) ||
(ss.compare(tt) == 0)));
if (cap && num)
cout << "Please, check your caps lock and num lock key."
<< endl;
else if (cap && !num)
cout << "Please, check your caps lock key." << endl;
else if (!cap && num)
cout << "Please, check your num lock key." << endl;
else
cout << endl;
}
return 0;
}

53/64

Tn chng trnh: DROP7.???

XA 7

Xa 7 l tr chi mt ngi. Cho li vung kch thc 77, cc ct c nh s t 1 n


7 t tri sang phi. Ban u li vung rng. mi lt i s c mt vin bi ri xung t
trn ct i. Vin bi c nh mt trong cc s t 1 n 7. y chng ta ch xem xt vic x
l bng khi vin bi ri xung ct i. Vin
bi s ri xung y ct i nu ct ny
3
rng hoc dng li khi chm vin bi trn
cng trong ct. Mi vin bi chim ng 1
.
V d, nu ta th vin bi 3 ct 1 n s
dng li trn vin bi 6, nu th n ct
3, n s dng li y, cn nu th ct
7 dng trn vin bi 5. Cc vin bi trong
Nhm ct
mt ct to thnh nhm ct. Dy cc vin
Nhmhng
bi k nhau trong mt hng hai u ca
4
6
dy l trng hoc bin ca li to
thnh mt nhm hng. S lng bi trong
5
7
6 5
nhm gi kch thc ca nhm. Nu c
mt hoc mt vi vin bi trong nhm c
6 5
7 5 6 3
s ng bng kch thc ca nhm th
nhng vin bi s b bc hi, bin mt
1 2 3 4 5 6 7
khi bng, nhng cha cc vin bi ny
s tr thnh trng v cc vin bi cn li (nu c) trong ct s ri xung di, lp vo cc
trng.
V d, nu vin bi 3 c th vo ct 4, n s to thnh mt nhm ct kch thc 3 v n s
b bc hi. Nu th n vo ct 7, mt nhm ct kch thc 3 cng s hnh thnh, cc vin bi
dng 1 v 3 s b bc hi v vin bi 4 s ri xung y. Vic cc vin bi bc hi lm thay
i cu hnh bi trong bng, hnh thnh nhng nhm hng, nhm ct mi v li c th lm mt
s vin bi no khc bc hi!
Cho bng rng ban u. Xt n vin bi ln lt ri xung, vin bi th i c s l vi ri xung
ct ci. Hy a ra trng thi cui cng ca bng di ma trn 77 k t (7 xu di 7), k
t # ch trng, k t s ch s hiu ca vin bi ti . Nu mt thi im no , mt
ct y m vn c bi ri xung ct th a ra thng bo Game Over!.
D liu: Vo t file vn bn DROP7.INP gm nhiu tests, mi test cho trn mt nhm dng,
dng u tin trong nhm cha s nguyn n (1 n 1000), dng th i trong n dng tip
theo cha 2 s nguyn vi v ci. File d liu kt thc bng dng cha mt s 0.
Kt qu: a ra file vn bn DROP7.OUT, kt qu mi test c a ra di dng 7 dng,
mi dng mt xu di 7 hoc a ra 1 dng thng bo Game Over!. Gia kt qu ca
2 tests lin tip nhau l mt dng trng.
54/64

V d:
DROP7.INP
6
2 2
3 2
6 2
4 3
1 1
6 7
11
5 3
5 3
2 3
2 3
2 3
3 3
4 3
5 3
6 3
7 3
1 3
0

DROP7.OUT
#######
#######
#######
#######
#######
#######
#64###6
Game Over!

55/64

C++
#include <iostream>
using namespace std;
int n, a[10][10], top[10];
bool find(){
for (int col = 1; col <= 7; col++)
for (int i = 1; i <= 7; i++)
if (top[col] > 0 && a[col][i] == top[col])
return true;
for (int row = 1; row <= 7; row++){
int i = 1;
while (i <= 7){
while (i <= 7 && a[i][row] == 0)
i++;
int j = i;
while (a[j+1][row])
j++;
for (int k = i; k <= j; k++)
if (j > i && a[k][row] == j-i+1)
return true;
i = j+1;
}
}
return false;
}
void del_column(int col){
if (top[col] == 0)
return;
int num_del = 0;
for (int i = 1; i <= 7; i++)
if (a[col][i] == top[col]){
a[col][i] = 0;
num_del++;
}
top[col] -= num_del;
}
void del_row(int row){
int i = 1;
while (i <= 7){
while (i <= 7 && a[i][row] == 0)
i++;
int j = i;
while (a[j+1][row])
j++;
for (int k = i; k <= j; k++)
if (j > i && a[k][row] == j-i+1){
a[k][row] = 0;
top[k]--;
}
i = j+1;
}
}

56/64

void drop_column(int col){


int num = 0, temp[10];
memset(temp, 0, sizeof(temp));
for (int i = 1; i <= 7; i++)
if (a[col][i]){
temp[++num] = a[col][i];
a[col][i] = 0;
}
for (int i = 1; i <= num; i++)
a[col][i] = temp[i];
}
int main(){
freopen("DROP7.INP", "r", stdin);
freopen("DROP7.OUT", "w", stdout);
while (true){
scanf("%d", &n);
if (n == 0)
break;
memset(a, 0 , sizeof(a));
memset(top, 0, sizeof(top));
int val, col;
bool game_over = false;
while (n--){
scanf("%d %d", &val, &col);
if (top[col] == 7)
game_over = true;
a[col][++top[col]] = val;
while (find()){
for (int col = 1; col <= 7; col++)
del_column(col);
for (int row = 1; row <= 7; row++)
del_row(row);
for (int col = 1; col <= 7; col++)
drop_column(col);
}
}
if (game_over){
printf("Game Over!\n");
continue;
}
for (int row = 7; row >= 1; row--){
for (int col = 1; col <= 7; col++)
if (a[col][row] == 0)
printf("#");
else
printf("%d", a[col][row]);
printf("\n");
}
printf("\n");
}
return 0;
}

57/64

BNG GIY

Tn chng trnh: STRIP.PAS

Xt bng giy c di 2K v rng mt . Cc dc nh s t tri sang phi, bt u t 1.


Ngi ta gp i bng giy sao cho cc u tin nm lp di. Nh vy bng giy tr thnh hai
lp v di cn mt na. Ngi ta c gp i nh vy cho n khi n c 2K lp.
Yu cu: Cho K v N (1 K 30, 1 N 2 000 000 000), hy xc nh th N nm lp th my
t di ln.

D liu: Vo t file vn bn STRIP.INP cha 2 s nguyn K v N.


Kt qu: a ra file vn bn STRIP.OUT s th t tm c hoc gi tr -1 nu bng giy
khng c N.
V d:
STRIP.INP
4 3

STRIP.OUT
9

58/64

C++
#include <fstream>
#include <string>
using namespace std;
int n, k, kk, p = 1, q;
string s;
ifstream fi ("STRIP.INP");
ofstream fo ("STRIP.OUT");
inline void input(){fi >> k >> n;}
inline void initial(){k--; n--; s = "";}
inline void generate_s(){
while (k>=0){
if (((n >> k) & 1) == 0)
s += 'D';
else{
s += 'U';
n = ~n;
}
k--;
}
}
inline void process(){
for (int i = 0; i < s.size(); i++){
if (s[i] == 'U'){
int temp = p;
p = p+(q << 1)+1;
q = temp-1;
}
else
q += p+q;
}
}
inline void output(){
fo << p;
}
int main(){
input();
initial();
generate_s();
process();
output();
return 0;
}

59/64

Tn chng trnh: CONTOUR.???

NG VIN

Mt khu cng nghip c gii hn bi ng gp khc khp kn khng t ct n nh c cc


cnh song song vi trc ta (4 n 105). nh th i ca ng gp khc c ta
nguyn (xi, yi), gi tr tuyt i ca cc ta khng vt qu 109.
Ngi ta lm mt con ng chy dc theo bin ca khu cng nghip vi rng ca ng
l d (d nguyn, 0 < d < 1000). Mi on thng ca ng c mt cnh l ng bin ca
khu cng nghip, cnh kia l ng song song
v nm ngoi khu cng nghip. Cc cnh ny
to thnh mt hnh bao ly khu cng nghip.
Hy xc nh ta nh ca hnh bao.
D liu: Vo t file vn bn CONTOUR.INP:

Dng u tin cha 2 s nguyn n v d,

Dng th i trong n dng sau cha 2 s


nguyn xi v yi.

Ta cc nh c cho theo mt chiu no


. D liu m bo tn ti hnh bao.
Kt qu: a ra file vn bn CONTOUR.OUT n dng, dng th i cha 2 s nguyn xc nh
ta nh th i ca hnh bao. Ta cc nh c a ra theo chiu ngc kim ng h,
bt u t nh cao nht v tri nht.
V d:
CONTOUR.INP

CONTOUR.OUT

6 1
5 -1
5 5
2 5
2 2
-2 2
-2 -1

1 6
1 3
3 -3
-3 -2
6 -2
6 6

60/64

C++
#include <iostream>
using namespace std;
int n, d, first = 100009, x[100010], y[100010], res_x[100010], res_y[100010];
bool clockwise;
void input(){
cin >> n >> d;
for (int i = 1; i <= n; i++)
cin >> x[i] >> y[i];
x[n+1] = x[1];
y[n+1] = y[1];
x[0] = x[n];
y[0] = y[n];
}
void define_direction(){
int S = 0;
for (int i = 1; i <= n; i++)
S += x[i]*y[i+1] - y[i]*x[i+1];
clockwise = (S < 0);
}
void process(){
y[first] = -INT_MAX;
x[first] = INT_MAX;
for (int i = 1; i <= n; i++){
if (x[i] == x[i-1]){
if (y[i] > y[i-1])
res_y[i] = y[i] + d;
else
res_y[i] = y[i] - d;
if (x[i] < x[i+1])
res_x[i] = x[i] - d;
else
res_x[i] = x[i] + d;
}
else{// x[i] == x[i+1]
if (y[i] > y[i+1])
res_y[i] = y[i] + d;
else
res_y[i] = y[i] - d;
if (x[i] < x[i-1])
res_x[i] = x[i] - d;
else
res_x[i] = x[i] + d;
}
if (y[i] > y[first] || (y[i] == y[first] && x[i] < x[first]))
first = i;
}
}
void output(){
if (!clockwise){
for (int i = first; i <= n; i++)
cout << res_x[i] << " " << res_y[i] << endl;
for (int i = 1; i < first; i++)
cout << res_x[i] << " " << res_y[i] << endl;
}
else{
for (int i = first; i >= 1; i--)
cout << res_x[i] << " " << res_y[i] << endl;
for (int i = n; i > first; i--)
cout << res_x[i] << " " << res_y[i] << endl;
}
}
int main(){
freopen("CONTOUR.INP", "r", stdin);
freopen("CONTOUR.OUT", "w", stdout);
input();
define_direction();
process();
output();
return 0;
}

61/64

Tn chng trnh: CREAM.???

MUA KEM

Rasmus v cc bn i ngh h . Thi tit qu nng bc, cc bn quyt nh mua mi


ngi vi cy kem cho kht. C n loi kem mi khc nhau nh s t 1 n n. C mt s
cp mi k nhau lm mt ngon. Rasmus mun bit c bao nhiu cch mua 3 cy kem khng
c cp mi k nhau. Trnh t mua khng ng vai tr quan trng.
V d, n = 5 v s cp mi k nhau m =3: (1, 2), (3, 4) v (1, 3). Khi Rasmus c 3 cch
mua: (1, 4, 5), (2, 3, 5) v (2, 4, 5).
D liu: Vo t file vn bn CREAM.INP:
Dng u tin cha 2 s nguyn n v m (1 n 200, 0 m 104),

Mi dng trong m dng sau cha 2 s nguyn p v q cp mi k nhau, 1 p, q n, p q,


khng c cp mi no b nu lp li.

Kt qu: a ra file vn bn CREAM.OUT mt s nguyn s cch mua.

V d:
5
1
3
1

CREAM.INP
3
2
4
3

CREAM.OUT
3

C++
#include <iostream>
using namespace std;
int n, m, u, v, res = 0;
bool contrast[201][201];
int main(){
freopen("CREAM.INP", "r", stdin);
freopen("CREAM.OUT", "w", stdout);
scanf("%d %d", &n, &m);
while (m--){
scanf("%d %d", &u, &v);
contrast[u][v] = contrast[v][u] = true;
}
for (int i = 1; i <= n-2; i++)
for (int j = i+1; j <= n-1; j++)
for (int k = j+1; k <= n; k++)
res += !(contrast[i][j] || contrast[i][k] ||
contrast[j][k]);
printf("%d", res);
return 0;
}

62/64

C++
#include <iostream>
#include <fstream>
using namespace std;
int n, m, u, v, res = 0;
int c[201][201];
int main()
{
ifstream fi ("CREAM.INP");
ofstream fo ("CREAM.OUT");
fi>>n>>m;
{int c[n+1][n+1],t;
memset(c,0,sizeof(c));
for (int i=1;i<=m;i++)
{fi>>u>>v;
c[u][v]=c[v][u]=1;
}
for (int i = 1; i <= n-2; i++)
for (int j = i+1; j <= n-1; j++)
for (int k = j+1; k <= n; k++)
{t=c[i][j]+c[i][k]+c[j][k];
if (t==0) res++;
}
}
fo<<res;
fo.close(); fi.close();
}

Tn chng trnh: CUBES.???

HNH KHI

T mt hnh lp phng ban u (gi l hnh khi bc 0) ngi ta dn vo cc mt ca n


hnh lp phng cng kch thc v c hnh khi bc 1. T hnh khi bc 1 ngi ta dn
cc hnh lp phng vo cc mt trng ca n v c hnh khi bc 2 (Xem hnh v). T

Hnh khi
bc 0

Hnh khi
bc 1

Hnh khi
bc 2

hnh khi bc i ngi ta to ra hnh khi bc i+1 bng cch dn cc hnh lp phng vo cc
mt trng ca n.
Yu cu: Cho s nguyn n ( 0 n 100 000). Hy xc nh s khi lp phng to ra hnh
khi bc n.
63/64

D liu: Vo t file vn bn CUBES.INP, gm nhiu Tests, mi test cho bi s nguyn n,


ghi trn mt dng.
Kt qu: a ra file vn bn CUBES.OUT, kt qu mi test l mt s nguyn, ghi trn mt
dng.
V d:
CUBES.INP
CUBES.OUT
1
2

7
25

C++
#include <fstream>
using namespace std;
ifstream fi ("CUBES.INP");
ofstream fo ("CUBES.OUT");
int n,ho,hn,co,cn,r;
int main()
{while (!fi.eof())
{hn=1;cn=1;
fi>>n;
for (int i = 1; i<n;i++)
{ho=hn;co=cn;
cn=co+i*4;
hn=ho+cn;
}
r=cn+2*ho;
fo<<r<<endl;
}
fo.close(); fi.close();
}

64/64

You might also like