You are on page 1of 53

1

MC LC
LI M U............................................................................................................................3
PHN I. S HC.....................................................................................................................3
BI 1. 3620. S phong ph - http://vn.spoj.pl/problems/NKABD/.......................................3
Bi 2. 1783. Tm s nguyn t - http://vn.spoj.pl/problems/PNUMBER/.............................7
Bi 3. 3632. S thn thin - http://vn.spoj.pl/problems/NKNUMFRE/...............................10
Bi 4. 4141. Euler Totient Function - http://vn.spoj.pl/problems/ETF/...............................13
PHN II. X L CHUI......................................................................................................14
Bi 1. 4257. First Number - http://vn.spoj.pl/problems/MDIGITS2/...................................14
Bi 2. 3638. Word Counting - http://vn.spoj.pl/problems/WORDCNT/..............................15
Bi 3. Tp s - Chuyn tin 2011...........................................................................................17
PHN III. TH.................................................................................................................19
Bi 1. 2722. Gm c - http://vn.spoj.pl/problems/VMUNCH/............................................19
Bi 2. 2719. Bi c ngon nht - http://vn.spoj.pl/problems/VBGRASS/.............................22
Bi 3. 2721. Nc lnh - http://vn.spoj.pl/problems/VCOLDWAT/...................................25
Bi 4. Hexgame - Chuyn tin 2011......................................................................................27
Bi 5. 3478. Xy dng thnh ph - http://vn.spoj.pl/problems/NKCITY/...........................30
Bi 6. 3125. n trng - http://vn.spoj.pl/problems/QBSCHOOL/...................................34
PHN IV. QUY HOCH NG..........................................................................................37
Bi 1. 2356. Lt gch - http://vn.spoj.pl/problems/LATGACH/..........................................37
Bi 2. 3883. Lt gch 3 - http://vn.spoj.pl/problems/M3TILE/............................................40
Bi 3. 2795. Steps - http://vn.spoj.pl/problems/VSTEPS/....................................................42
Bi 4. 2782. ng i c tng ln nht - http://vn.spoj.pl/problems/QBMAX/ .................44
PHN V. CC BI TON KHC.......................................................................................46
Bi 1. u gi - Chuyn tin 2010.........................................................................................46
Bi 2. Trng xe - Chuyn tin 2010.......................................................................................48
Bi 3. 3480. Cy nh phn tm kim - http://vn.spoj.pl/problems/NKTREE/......................49

2
Bi 4. 2786. Cy khung nh nht (HEAP) - http://vn.spoj.pl/problems/QBMST/...............51
Bi 5. 4031. Mass of Molecule- http://vn.spoj.pl/problems/MMASS/................................52

LI M U
phc v cho vic n luyn thi Olympic khi chuyn tin nm 2012, cc thnh vin
ca i tuyn Olympic chuyn tin nm 2011, Khoa Cng ngh thng tin - i hc
Hng Hi s tng hp li cc bi tp gii c, bao gm cc bi tp trn trang Gii
bi trc tuyn: http://vn.spoj.pl/problems/oi/, cc bi thi Olympic cc nm trc v
mt s bi tp khc.
Cc bi n luyn s c phn vo cc phn khc nhau bao gm:
PHN I. S HC
PHN II. TH
PHN III. QUY HOCH NG
PHN IV. CC BI TON KHC
Ngn ng lp trnh c s dng trong cc bi ch yu l C/C++.
Trong qu trnh bin son s khng th trnh khi nhng sai st, i tuyn rt hoan
nghnh s ng gp t tt c cc bn. Mi kin phn hi xin gi v hm th:
olptin@vimaru.edu.vn hoc trungvdt49@gmail.com . Chn thnh cm n!

PHN I. S HC
BI 1. 3620. S phong ph - http://vn.spoj.pl/problems/NKABD/
Trong s hc, s phong ph l cc s m tng cc c s ca s (khng k chnh
n) ln hn s . V d, s 12 c tng cc c s (khng k 12) l 1 + 2 + 3 + 4 + 6 =
16 > 12. Do 12 l mt s phong ph.
Bn hy lp trnh m xem c bao nhiu s phong ph trong on [L,R].
D liu
Gm 2 s L, R (1 <= L <= R <= 10^5)
Kt qu
Gm 1 s nguyn duy nht l s s phong ph trong on [L, R].
Ch
C 50% s test c 1 <= L <= R <= 10^3

4
V d
D liu
1 50
Kt qu
9
Gii thch:
T 1 n 50 c 9 s phong ph l: 12, 18, 20, 24, 30, 36, 40, 42, 48
Time: 1s
Gii
Cch gii thng thng l duyt tng s nguyn t L n R, tnh tng cc c ca s
khng k chnh n v kim tra nu tng ln hn s th tng bin m ln 1.
lit k cc c v tnh tng tt c cc c ca mt s a khng k a ta ch vic kim
tra ln lt cc s t 1 cho n a/2, nu a chia ht thi in ra c v cng thm c vo
bin tng, on m nh sau:
int main()
{
int a;
int i;
int tong=0;
scanf("%d",&a);
for(i=1;i<=a/2;++i)
{
if(a%i==0)
{
printf("%d ",i);
tong += i;
}
}
printf("\n%d",tong);
system("pause");
return 0;
}

mt cht ta thy, khng nht thit phi duyt t 1 cho n a/2 m ch cn duyt
cc s i chy t 2 cho n cn bc 2 ca a l , nu a chia ht cho i th tong = tong + i
+ a/i (ch l nu a/i = cn bc 2 ca a th tong = tong + i). on m nh sau:
#include <stdio.h>
#include <math.h>
int main()
{

5
int a;
int i;
int tong=1;
scanf("%d",&a);
int cb2 = (int)sqrt(a);
printf("Cac uoc cua %d la:\n 1 ",a);
for(i=2;i<cb2;++i)
{
if(a%i==0)
{
printf("%d %d ",i,a/i);
tong += i+a/i;
}
}
if(a%cb2==0)
{
tong += cb2;
printf("%d ",cb2);
if(a != cb2*cb2)
{
tong+=a/cb2;
printf("%d",a/cb2);
}
}
printf("\nTong uoc cua %d = %d",a,tong);
//system("pause");
return 0;
}

Tuy nhin nu mi ln xt 1 s trong on [L,R] li chy hm kim tra xem s c


phi l s phong ph khng th s rt mt thi gian. Thay v iu ta s dng thut
ton kh ging vi t tng ca sng nguyn t vi nhn xt nu mt s a vit di
dng i*j th i v j chnh l c ca a. on m u tin nh sau (time=0.08s):
#include <stdio.h>
int a[100001];
int main()
{
int l,r,i,j,k=0;
scanf("%d%d",&l,&r);
for(i = 1; i<=r; i++)
a[i] = 1;
for(i = 2; i<=r/2; i++)
{
for(j = 2; j*i<=r; j++)
a[j*i] += i;
}
for(i=l; i<=r; i++)
if(a[i] > i) k++;
printf("%d",k);
//system("pause");

6
return 0;
}

on chng trnh trn x l vn cha ti u, theo nh nhn xt bn trn ta ch cn


xt cc s i chy t 2 cho n cn bc 2 ca R l . on m tip theo (time=0.04s):
#include<stdio.h>
#include<math.h>
int a[100001];
int main()
{
int l,r,i,j,k=0;
scanf("%d%d",&l,&r);
for(i = l; i<=r; i++)
a[i] = 1;
k=(int)sqrt(r);
for(i = 2; i<=k; i++)
{
a[i*i]+=i;
for(j=i+1; j*i<=r; j++)
a[j*i] += i + j;
}
k=0;
for(i=l; i<=r; i++)
if(a[i] > i) k++;
printf("%d",k);
//system("pause");
return 0;
}

Ci tin tip i mt cht vi nhn xt ch cn xt cho cc s bt u t L. on m


nh sau (time=0.03s = time ca test ln nht [L,R] = [1,100000]):
#include<stdio.h>
#include<math.h>
int a[100001];
int main()
{
int l,r,i,j,k=0,x;
scanf("%d%d",&l,&r);
for(i = l; i<=r; i++)
a[i] = 1;
k=(int)sqrt(r);
for(i = 2; i<=k; i++)
{
x=l/i;
j=(x>i && x<=k)?x:i;
if(i==j)
{
a[i*i] += i;
j++;
}

7
for(; j*i<=r; j++)
a[j*i] += i + j;
}
k=0;
for(i=l; i<=r; i++)
if(a[i] > i) k++;
printf("%d",k);
//system("pause");
return 0;
}

Bi ny time tt nht l 0.00s vit bng C++ ca ti khon bk20101531.


Trn y l bi khi ng vi t tng phn tch tng bc, ti u thut ton v cng
l t tng s xuyn sut cc bi tp khc trong tp san ny.
Tc gi: V nh Trung
Bi 2. 1783. Tm s nguyn t - http://vn.spoj.pl/problems/PNUMBER/
Hy tm tt c cc s nguyn t trong on [A,B] .
Input
Gm 2 s nguyn A v B cch nhau bi 1 du cch ( 1 A B 200000 ) .
Output
Ghi ra tt c cc s nguyn t trong on [A,B]. Mi s trn 1 dng .
V d
Input:
1 10
Output:
2
3
5
7
Time: 5s
y l mt bi trong mc http://vn.spoj.pl/problems/acm/, bt buc kt qu a ra phi
trong thi gian cho php v phi ng hon ton, sai 1 test coi nh l sai c, khc vi
trong http://vn.spoj.pl/problems/oi/ ng test no n im test y.

8
Gii
1. Cch gii thng thng:
Vit 1 hm kim tra s nguyn t. C nhiu cch kim tra s a c phi l s
nguyn t khng:
Th s nht l kim tra nu a c chia ht cho bt k mt s nguyn no trong
on [2,a/2] th n khng phi l s nguyn t.
Cch th hai vi nhn xt nu a l s nguyn t th n s khng chia ht cho bt
k s nguyn no trong on [2, sqrt(a)]
Cch th ba vi nhn xt nu a l s nguyn t th n s khng chia ht cho bt
k s nguyn t no trong on [2, sqrt(a)]
Cc cch trn bn c c th d dng ci t, tuy nhin vn cn mt s cch
khc nhanh hn nhng ta khng bn n y v ci t n cng khc phc
tp.
Tip theo ch vic xt cc s trong on [A,B], nu hm kim tra n ng l s
nguyn t th in ra.
Nhn xt: cch gii thng thng th kh nng qu thi gian l rt cao mc d time
cho ti 5s vi gii hn ca bi ny.
2. Dng sng nguyn t
Vic dng sng nguyn t s gip ta nhanh chng in ra cc s nguyn t trong mt
gii hn m b nh cho php ci t.
Sng thng thng l ta xt cc s i trong on [2,sqrt(B)], nu i l s nguyn t th
cc bi ca i khng phi l s nguyn t tc l i*j vi j trong on [i, B/i] khng
phi l s nguyn t. Cui cng ta ch cn duyt li mng nh du v in ra cc s
nguyn t. on m nh sau (time: 0.08s):
#include <stdio.h>
#include <math.h>
char a[200000];
void sang(int n)
{
int i,j,u;
int x = (int)sqrt(n);
a[0]=1;
a[1]=1;
for(i=2;i<=x;i++)

9
{
u=n/i+1;
if(a[i]==0)
{
for(j=i;j<u;++j)
{
if(a[j*i]==0)
a[j*i]=1;
}
}
}
}
int main()
{
int i,k,A,B;
scanf("%d%d",&A,&B);
sang(B);
for(i = A; i<=B; ++i)
{
if(a[i]==0)
printf("%d\n",i);
}
system("pause");
return 0;
}

Sng ci tin b nh l sng m ta ch xt cc s l v s nguyn t u l s l


ngoi tr 2, do b nh nh du gim i mt na. Ci t ca thut ton ny
c phn phc tp hn thut ton trn mt cht, vi thi gian sng tng ng
nhau nhng nhanh hn v thi gian duyt in ra. on m nh sau (time: 0.05s):
#include <stdio.h>
#include <math.h>
char a[100000];
void sang(int n)
{
int i,j,k,u;
int x = (int)sqrt(n);
for(i=1;;i++)
{
k=i*2+1;
if(k>x) break;
u=(n+1)/k;
if(a[i]==0)
{
for(j = k;j<u+1;j+=2)
{
if(a[(j*k-1)/2]==0)
a[(j*k-1)/2]=1;
}
}

10
}
}
int main()
{
int i,k,A,B;
scanf("%d%d",&A,&B);
if(A<=2)
{
A = 1;
printf("2\n");
}
else
A = A/2;
sang(B);
B = B/2 + B%2;
for(i = A; i<B; ++i)
{
if(a[i]==0)
printf("%d\n",i*2+1);
}
//system("pause");
return 0;
}

Ngoi ra cn c cc sng ci tin khc v b nh c th tham kho thm ti blog


ca tc gi: http://my.opera.com/trung8290/blog/sang-nguyen-to.
Tc gi: V nh Trung
Bi 3. 3632. S thn thin - http://vn.spoj.pl/problems/NKNUMFRE/
S t nhin c rt nhiu tnh cht th v. V d vi s 23, s o ngc ca n l 32.
Hai s ny c c chung ln nht l 1. Nhng s nh th c gi l s thn thin, tc
l s 23 c gi l s thn thin, s 32 cng c gi l s thn thin.
Hy nhp vo 2 s nguyn a,b (10ab30000). Hy m xem trong khong t a n
b (k c a v b) c bao nhiu s thn thin.
D liu
Bao gm mt dng cha 2 s a,b. Hai s c cch nhau bng mt khong trng
Kt qu
Bao gm mt dng l kt qu ca bi ton.
V d
D liu

11
20 30
Kt qu
3
Time: 1s
Gii
gii bi ny trc tin ta phi vit 2 hm l hm o ngc 1 s nguyn v hm tm
c chung ln nht.
Hm o ngc s nguyn
Ta c th lm theo cch chuyn s nguyn v dng chui (dng hm sprintf()
hoc itoa() ) , o ngc chui v li chuyn chui v dng s nguyn (dng
hm atoi()). Cch ny bn c t ci t.
Cch th hai l chuyn s nguyn v mng cc ch s nguyn sau tnh li.
on m nh sau:
int daonguoc(int n)
{
int i,k=0,hs[5],m=0,cs=1;
while(n != 0)
{
hs[k++] = n%10;
n = n/10;
}
for(i = k-1; i>=0; i--)
{
m += hs[i]*cs;
cs *= 10;
}
return m;
}

Hm tm c chung ln nht
Ci t quy:
int ucln(int a, int b)
{
if (a==0 ||b==0) return a+b;
if(a==b) return a;
if(a>b) return ucln(a-b,a);
return ucln(a, b-a);
}

Hoc:

12
int ucln(int a, int b)
{
if (a==0 ||b==0) return a+b;
if(a%b==0) return b;
return ucln(b, a%b);
}

Ci t khng quy:
int ucln(int a, int b)
{
if (a==0 ||b==0)return a+b;
while (a !=b)
{
if(a>b)
a=a-b;
else
b=b-a;
}
return a;
}

Chng trnh chnh


Theo bi nu i v k=daonguoc(i) c ucln(i,k) =1 th c i v k u gi l s thn
thin, nhng ta phi kim tra xem k c nm trong on [a,b] khng v k xt
cha do phi c mng check[] dnh du. on m nh sau (time = 0.04s):
#include <stdio.h>
char check[30001];
int main()
{
int i,a,b,k,d=0;
scanf("%d%d",&a,&b);
for(i=a; i<=b; ++i)
{
if(check[i] == 0)
{
k = daonguoc(i);
if(ucln(i,k)==1)
{
d++;
check[i] = 1;
if(a<=k && k<=b && check[k] == 0)
{
check[k]=1;
d++;
}
}
}

13
}
printf("%d",d);
//system("pause");
return 0;
}

Tc gi: V nh Trung
Bi 4. 4141. Euler Totient Function - http://vn.spoj.pl/problems/ETF/
Trong s hc, hm -le ca mt s nguyn dng n c nh ngha l s lng cc
s nguyn dng nh hn hoc bng n v nguyn t cng nhau vi n.
Cho s nguyn dng n (1 <= n <= 10^6). Tnh gi tr ca hm -le.
Input
Dng u cha s nguyn T l s test (T <= 20000)
T dng tip theo, mi dng cha mt s nguyn n.
Output
T dng, mi dng ghi kt qu ca test tng ng.
Example
Input:
5
1
2
3
4
5
Output:
1
1
2
2
4
Time: 1s
Gii
Hm le c cng thc nh sau: f(n) = n.(1 - 1/p1).(1 - 1/p2). .. .(1 - 1/pk)
Vi p1, p2,.., pk l cc c nguyn t ca n.

14
Nh vy trc tin ta phi vit hm tm tt c cc c nguyn t ca n. Trong hm ny
ta s duyt t cc s i t 2 cho n cn bc hai ca n, nu n chia ht cho i th lu i vo
mng cc c ca n v lp n=n/i trong khi n vn chia ht cho i. Khi duyt xong nu
n>1 th n cng chnh l mt c ca s ban u. Bn c c th d dng ci t hm
ny.
Sau khi ci t xong hm tm tt c cc c nguyn t: factor(int n), cng vic cn li
rt n gin ch l duyt v m. Hm chnh nh sau (time = 0.79s):
int main()
{
int t,n;
int i,j;
int tam;
scanf("%d",&t);
for(i=0; i<t; ++i)
{
scanf("%d",&n);
factor(n);
tam=1;
for(j=0; j<k; ++j)
{
tam*=a[j]-1;
n/=a[j];
}
printf("%d\n",tam*n);
}
return 0;
}

Tc gi: V nh Trung

PHN II. X L CHUI


Bi 1. 4257. First Number - http://vn.spoj.pl/problems/MDIGITS2/
Vit cac s thp phn 1,2, ... lin tip thu c day s nh sau :
12345678910111213141516171819202122 ...
etc. Vit chng trinh tim vi tri xut hin u tin cua s N trong day trn.
Input
Gm duy nht 1 s N, 1 N 100,000.
Output

15
S duy nht la vi tri xut hin u tin cua s N trong day.
Sample
Input
Output

15
20

34
3

142
73

Time: 1s
Gii
Bi ny n gin ch l ghp chui s v tm v tr xut hin ca chui con. Mc tiu
cc bn luyn tp dng th vin string STL ca C++. Chng trnh nh sau (time:
0.57s):
#include<iostream>
#include<string>
using namespace std;
int main()
{
int n;
string s="";
char t[7];
cin>>n;
for(int i=1; i<=n; ++i)
{
sprintf(t,"%d",i);
s+=t;
}
sprintf(t,"%d",n);
cout<<s.find(t)+1;
//system("pause");
return 0;
}

Tc gi: V nh Trung
Bi 2. 3638. Word Counting - http://vn.spoj.pl/problems/WORDCNT/
Nguyn ang vit mt phn mm m t trong mt xu k t. Cu cm thy bun
chn sau khi vit xong phn mm rt nhanh. By gi, cu mun tm P l s lng ln
nht cc t c di bng nhau ng lin tip trong xu cho trc.
Cho mt xu ch cha cc k t t a n z v k t trng. Mi t l mt chui cc k
t lin tip khc k t trng v cc t phn tch nhau bi t nht mt k t trng.
Nhim v ca bn l vit chng trnh gip Nguyn tm s P ni trn.

16
D liu vo
D liu vo gm nhiu b d liu tng ng vi nhiu test. Dng u tin cha mt s
nguyn dng khng ln hn 20 l s lng cc b d liu. Cc dng tip theo cha
cc b d liu.
Trn mi dng tip theo cha xu k t c khng qu 1000 t tng ng vi mi b
d liu, mi t c khng qu 20 k t.
D liu ra
Vi mi b d liu, ghi ra trn mt dng s P m Nguyn mun tm.
V d
D liu vo
2
a aa bb cc def ghi
a a a a a bb bb bb bb c c
D liu ra
3
5
Time: 1s
Gii
Vi bi ny ta phi c c dng (chui c du cch) s dng hm cin.getline() ca C+
+ hoc hm gets() ca C.
Sau ta s duyt v m s k t ca tng t v lu vo mng m.
Cui cng ch vic duyt t u n cui mng m tm on con di nht c cc
phn t lin tip bng nhau.
on chng trnh nh sau (time: 0.00s ):
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char *s = new char[20002];
char *c = new char[20002];
short n;
cin>>n;
//bat buoc phai them doan cin.getline(s,20001); sau
vao de loai bo dong dau tien

17
cin.getline(s,20001);
for(int i=0; i<n; ++i)
{
memset(c,0,20001);
cin.getline(s,20001);
short k = 0, max = 0,v=0;
s[strlen(s)]=0;
for(int j=0; j<=strlen(s); ++j)
{
if(s[j] <='z' && s[j]>= 'a')
++k;
else
{
if(k!=0)
{
c[v++] = k;
k=0;
}
}
}
k = 1;
c[v++] = 0;
for(int j=1; j<v; ++j)
{
if(c[j] == c[j-1])
++k;
else
{
if(max < k) max = k;
k=1;
}
}
cout<<max<<endl;
}
return 0;
}

Tc gi: V nh Trung
Bi 3. Tp s - Chuyn tin 2011
Cho s n h c s 10, c khng qu 20 ch s v khng cha cc s 0 khng c
ngha u.
Bng cch xa mt hoc mt vi ch s lin tip ca n (nhng khng xa ht tt c
cc ch s ca n) ta nhn c nhng s mi. S mi c chun ha bng cch xa
cc ch s 0 v ngha nu c.

18
Tp s nguyn D c xy dng bng cch a vo n s n, cc s mi khc nhau
chun ha v khc n. V d, vi n = 1005 ta c th nhn c cc s mi nh sau:
Bng cch xa mt ch s ta c cc s: 5 (t 005), 105, 105, 100;
Bng cch xa hai ch s ta c cc s: 5 (t 05), 15, 10;
Bng cch xa 3 ch s ta c cc s: 5 v 1.
Tp D nhn c t n cha cc s {1005, 105, 100, 15, 10, 5, 1}. Trong tp D ny c
3 s chia ht cho 3, l cc s 1005, 105 v 15.
Yu cu: Cho s nguyn n. Hy xc nh s lng s chia ht cho 3 c mt trong tp
D c to thnh t n.
D liu: Vo t file vn bn NUMSET.INP gm mt dng cha s nguyn n.
Kt qu: a ra file vn bn NUMSET.OUT mt s nguyn s lng s chia ht
cho 3 tm c.
V d:
NUMSET.INP

NUMSET.OUT

1005

Time : 2s
Gii
Gii hn bi ny kh nh, c th gii quyt n gin bng cch s dng th vin STL
ca C++.
Ta c s n nh l c mt chui s nguyn (string). Vic ct b i cc ch s th ta s
s dng hm ct chui con substr() ca i tng string.
Tp D cha cc s i mt khc nhau, do ta s s dng cu trc set ca C++ (cu
trc ny c ti u lu tr cc gi tr khc nhau v c sp xp mc nh theo
th t tng dn).
Cui cng ta ch vic kim tra tng cc ch s ca tng chui s nguyn trong set nu
c chia ht cho 3 th tng bin m ln. Ci t nh sau (time : 0.01- 0.02s) :
#include<iostream>
#include<set>
#include<cstring>
using namespace std;
int main()
{
//freopen("NUMSET.INP","rt",stdin);

19
string n,s;
set<string> st;
cin>>n;
int len = n.length();
st.insert(n);
for(int i=1; i<len; ++i)
{
for(int j=0; j<= len-i; ++j)
{
s=n.substr(0,j) + n.substr(j+i);
while(s[0] == '0') s=s.substr(1);
st.insert(s);
}
}
set<string>::iterator it;
int tong;
int dem=0;
for(it=st.begin(); it!=st.end(); ++it)
{
tong=0;
for(int i=0; i<(*it).length(); ++i)
tong+=(*it)[i]-'0';
if(tong % 3 == 0) dem++;
}
//freopen("NUMSET.OUT","wt",stdout);
cout<<dem;
//system("pause");
return 0;
}

Tc gi: V nh Trung

PHN III. TH
Bi 1. 2722. Gm c - http://vn.spoj.pl/problems/VMUNCH/
Bessie rt yu bi c ca mnh v thch th chy v chung b vo gi vt sa bui
ti.
Bessie chia ng c ca mnh l 1 vng hnh ch nht thnh cc vung nh vi R
(1 <= R <= 100) hng v C (1 <= C <= 100) ct, ng thi nh du ch no l c v
ch no l . Bessie ng v tr R_b,C_b v mun n c theo cch ca mnh, tng
vung mt v tr v chung 1,1 ; bn cnh ng i ny phi l ngn nht.
Bessie c th i t 1 vung sang 4 vung khc k cnh.

20
Di y l mt bn v d [vi ('*'), c ('.'), chung b ('B'), v Bessie ('C')
hng 5, ct 6] v mt bn cho bit hnh trnh ti u ca Bessie, ng i c dnh
du bng ch m.

Bessie n c 9 c.
Cho bn , hy tnh xem c bao nhiu c m Bessie s n c trn con ng
ngn nht tr v chung (tt nhin trong chung khng c c u nn ng c tnh
nh)
D liu

Dng 1: 2 s nguyn cch nhau bi du cch: R v C

Dng 2..R+1: Dng i+1 m t dng i vi C k t (v khng c du cch) nh


ni trn.

Kt qu

Dng 1: Mt s nguyn l s c m Bessie n c trn hnh trnh ngn nht


tr v chung.

V d
D liu
56
B...*.
..*...
.**.*.
..***.
*..*.C
Kt qu
9
Time: 1s

21
Gii
y l mt bi duyt theo chiu rng BFS thng thng nhanh chng tm ra ng
i ti u. Sau y ta s ci t thut ton ny bng C++ s dng hng i queue ca
STL v xy dng theo kiu class. Bn c cng c th t ci t bng C s dng mng
v struct.
T bt u Bessie ng ta s loang ra 4 bn cnh l trn, di, tri, phi nu
khng c , ri li loang tip, c nh vy cho n khi v n chung ta s ly
khong cch nh nht.
Ci t nh sau (time: 0.05s):
#include<iostream>
#include<queue>
#define maxN 100
using namespace std;
class node
{
public:
int x;
int y;
int d;
node(int x1, int y1, int d1):x(x1),y(y1),d(d1){}
};
bool a[maxN][maxN];
int main()
{
int m,n;
int xb,yb,xc,yc;
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
char c;
scanf("%d%d",&m,&n);
for(int i=0; i<m; ++i)
{
for(int j=0; j<n; ++j)
{
cin>>c;
if(c=='B')
{
xb=j;
yb=i;
a[i][j]=true;
}
else if(c=='C')
{
xc=j;
yc=i;

22
a[i][j]=false;
}
else if(c=='.')
a[i][j]=true;
else
a[i][j]=false;
}
}
queue<node> q;
node u(xc,yc,1);
q.push(u);
int x1,y1;
int min=10000;
while(!q.empty())
{
u=q.front();
q.pop();
if(u.x==xb && u.y==yb)
{
if(u.d<min) min=u.d;
}
else
{
for(int i=0; i<4; ++i)
{
x1 = u.x + dx[i];
y1 = u.y + dy[i];
if(x1>=0 && x1<n && y1>=0 && y1<m && a[y1]
[x1])
{
a[y1][x1]=false;
q.push(node(x1,y1,u.d+1));
}
}
}
}
printf("%d",min-1);
return 0;
}

Tc gi: V nh Trung
Bi 2. 2719. Bi c ngon nht - http://vn.spoj.pl/problems/VBGRASS/
Bessie d nh c ngy s nhai c xun v ngm nhn cnh xun trn cnh ng ca
nng dn John, cnh ng ny c chia thnh cc vung nh vi R (1 <= R <=
100) hng v C (1 <= C <= 100) ct. Bessie c g c th m c s khm c trn
cnh ng.

23
Mi khm c trn bn c nh du bng mt k t # hoc l 2 k t # nm k
nhau (trn ng cho th khng phi). Cho bn ca cnh ng, hy ni cho Bessie
bit c bao nhiu khm c trn cnh ng.
V d nh cnh ng di dy vi R=5 v C=6:
.#....
..#...
..#..#
...##.
.#....
Cnh ng ny c 5 khm c: mt khm hng u tin, mt khm to bi hng th 2
v th 3 ct th 2, mt khm l 1 k t nm ring r hng 3, mt khm to bi ct
th 4 v th 5 hng 4, v mt khm cui cng hng 5.
D liu

Dng 1: 2 s nguyn cch nhau bi du cch: R v C

Dng 2..R+1: Dng i+1 m t hng i ca cnh ng vi C k t, cc k t l


# hoc . .

Kt qu

Dng 1: Mt s nguyn cho bit s lng khm c trn cnh ng.

V d
D liu
56
.#....
..#...
..#..#
...##.
.#....
Kt qu
5
Time: 1s
Gii
Bi ny ta c th duyt theo chiu su DFS hoc chiu rng BFS. Ta s duyt m
s thnh phn lin thng ca th cng chnh l s lng khm c trn cnh ng.
Thut ton tng t bi Gm c. Ci t nh sau (time: 0.06s):

24
#include<iostream>
#include<queue>
#define maxN 101
using namespace std;
char a[maxN][maxN];
int main()
{
int r,c;
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
scanf("%d%d",&r,&c);
for(int i=0; i<r; ++i)
{
for(int j=0; j<c; ++j)
{
cin>>a[i][j];
}
}
queue< pair<int,int> > q;
pair<int,int> p;
int kq=0;
int x,y;
for(int i=0; i<r; ++i)
{
for(int j=0; j<c; ++j)
{
if(a[i][j]=='#')
{
a[i][j]='.';
kq++;
q.push(make_pair(i,j));
while(!q.empty())
{
p=q.front();
q.pop();
for(int k=0; k<4; ++k)
{
x=p.first+dx[k];
y=p.second+dy[k];
if(a[x][y]=='#')
{
a[x][y]='.';
q.push(make_pair(x,y));
}
}
}
}
}
}
cout<<kq;
return 0;
}

25
Tc gi: V nh Trung
Bi 3. 2721. Nc lnh - http://vn.spoj.pl/problems/VCOLDWAT/
Ma h oi Wisconsin khin cho l b phi i tm nc lm du i cn kht.
Cc ng ng dn nc ca nng dn John dn nc lnh vo 1 tp N (3 <= N <=
99999; N l) nhnh (nh s t 1..N) t mt ci bm t chung b.
Khi nc lnh chy qua cc ng, sc nng ma h s lm nc m ln. Bessie mun
tm ch c nc lnh nht c b c th tn hng ma h mt cch thoi mi nht.
Bessie v s ton b cc nhnh ng nc v nhn ra rng n l mt th dng
cy vi gc l chung b v cc im nt ng th c chnh xc 2 nhnh con i ra t
nt . Mt iu ngc nhin l cc nhnh ng ny u c di l 1.
Cho bn cc ng nc, hy cho bit khong cch t chung b ti tt c cc nt
ng v cc phn cui ng ng.
Phn cui ca mt ng ng, c th l i vo mt nt ng hoc l b bt, c gi
theo s th t ca ng ng. Bn c C (1 <= C <= N) nt ng, c m t bng 3
s nguyn: l phn cui ca ng E_i (1 <= E_i <= N) v 2 ng nhnh i ra t l
B1_i v B2_i (2 <= B1_i <= N; 2 <= B2_i <= N). ng ng s 1 ni vi chung b;
khong cch t phn cui ca ng ng ny ti chung b l 1.
D liu

Dng 1: 2 s nguyn cch nhau bi du cch: N v C

Dng 2..C+1: Dng i+1 m t nt ng i vi ba S nguyn cch nhau bi du


cch: E_i, B1_i, v B2_i

Kt qu

Dng 1..N: Dng i cha 1 s nguyn l khong cch t chung ti phn cui
ca ng th i.

V d
D liu
52
354
123

26
Gii thch:
D liu trn m t bn ng nc sau:

Kt qu
1
2
2
3
3
Gii thch:
ng 1 lun cch chung 1 on l 1. ng 2 v 3 ni vi ng 1 nn khong cch s l
2. ng 4 v 5 ni vi ng 3 nn khong cch s l 3.
Time: 1s
Gii
y l bi ton duyt cy nh phn v tnh bc ca nt kh n gin. Trc tin ta s
xy dng cy, sau duyt cy t gc bc bng 1 v c th lan xung nt con tri v
nt con phi ng thi tng bc ln. Ci t nh sau (time: 0.44s):
#include <stdio.h>
#define MaxN 100000
typedef struct node
{
int k;
int l;
int r;
}node;
node T[MaxN];
void visit(int u, int k)
{
T[u].k = k;
if(T[u].l !=0 && T[u].r != 0)
{
visit(T[u].l, k+1);
visit(T[u].r, k+1);
}
}

27
int main()
{
int i,n,c;
int u,l,r;
scanf("%d%d",&n,&c);
for(i=0; i<c; ++i)
{
scanf("%d%d%d",&u,&l,&r);
T[u].l = l;
T[u].r = r;
}
visit(1,1);
for(i=1; i<=n; ++i)
printf("%d\n",T[i].k);
return 0;
}

Tc gi: V nh Trung
Bi 4. Hexgame - Chuyn tin 2011

HEXGAME l mt tr chi xp hnh gm 10 ming ghp hnh lc gic u,


trn mi ming ghp c in mt s nguyn, c 8 ming c in s t 1 n 8 v
c hai ming in s 0. Cc ming lin kt vi nhau to thnh li t ong. Ban u cc
ming ghp v tr nh hnh bn. Ti mi bc, chn mt ming ghp c ng 6
ming ghp k cnh lm tm, ri xoay mt nc 6 ming ghp k cnh theo chiu
kim ng h. Nh vy ch c hai cch chn tm. V d vi trng thi ban u nu trn
th nhn c mt trong hai trng thi di y ng vi cch chn sau khi xoay mt
nc.

28
Yu cu: Cho mt trng thi ca tr chi (nhn c sau mt dy bin i t trng
thi ban u), hy tnh s php bin i t nht a v trng thi ban u.
D liu: Vo t file vn bn HEXGAME.INP c dng:
Dng 1: cha 3 s ghi trn 3 ming ghp dng th nht ca li theo th t t
tri qua phi;
Dng 2: cha 4 s ghi trn 4 ming ghp dng th hai ca li theo th t t
tri qua phi;
Dng 3: cha 3 s ghi trn 3 ming ghp dng th ba ca li theo th t t
tri qua phi.
Kt qu: a ra file vn bn HEXGAME.OUT gm mt dng ghi mt s l s php
bin i t nht.
HEXGAME.INP
102
8603
754

HEXGAME.OUT
5

Ghi ch: c 50% s test c s php bin i khng vt qu 15.


Time: 2s
Gii
y l mt bi duyt th trng thi, ta s duyt qua cc nt trng thi ca game cho
n thi gp nt trng thi ban u. bi yu cu tm s php bin i t nht nn ta s
s dng thut ton tm kim theo chiu rng BFS.
Theo bi t 1 trng thi ta c th bin i c thnh 2 trng thi mi, ta c bng
tham chiu nh sau:

Ch s c

Ch s mi

0
1
8
3

1
2
1
0

Ch s c

Trng thi 1
2 3 4 5
3 8 0 0
3 7 0 2
2 7 4 1
Trng thi 2
2 3 4 5

6
4
4
6

7
7
6
8

8
6
0
5

9
5
5
9

29

Ch s mi

1
1
0

2
0
4

3
2
1

8
8
3

0
6
8

0
0
5

4
3
2

7
7
7

6
5
9

5
4
6

Chng trnh sau vit bng ngn ng C++ vi class v queue, bn c c th t ci t


li bng C vi struct v array so snh (time: 0.02s out: 5; 0.33s out: 21):
#include<iostream>
#include<queue>
using namespace std;
class node
{
public:
int a[10];
node(){}
void input()
{
//freopen("HEXGAME.INP","rt",stdin);
for(int i=0; i<10; ++i)
cin>>a[i];
}
//Trang thai 1 lay tam ben trai de quay
node left()
{
node b;
b.a[0] = a[3];
b.a[1] = a[0];
b.a[2] = a[2];
b.a[3] = a[7];
b.a[4] = a[4];
b.a[5] = a[1];
b.a[6] = a[6];
b.a[7] = a[8];
b.a[8] = a[5];
b.a[9] = a[9];
return b;
}
//Trang thai 2 lay tam ben phi de quay
node right()
{
node b;
b.a[0]
b.a[1]
b.a[2]
b.a[3]
b.a[4]
b.a[5]
b.a[6]

=
=
=
=
=
=
=

a[0];
a[4];
a[1];
a[3];
a[8];
a[5];
a[2];

30
b.a[7]
b.a[8]
b.a[9]
return

= a[7];
= a[9];
= a[6];
b;

}
//Kiem tra trang thai ban dau
bool isroot()
{
if(a[0]!=1 || a[1]!=2 || a[2]!=3 || a[3]!=8 ||
a[4]!=0 ||a[5]!=0 || a[6]!=4 || a[7]!=7 ||
a[8]!=6 || a[9]!=5)
return false;
return true;
}
};
int main()
{
queue< pair<node, int> > q;
node b;
b.input();
q.push(make_pair(b,0));
pair<node, int> u;
while(true)
{
u = q.front();
q.pop();
b=u.first;
if(b.isroot())
{
//freopen("HEXGAME","wt",stdout);
cout<<u.second;
break;
}
else
{
//Dua 2 trang thai moi vao hang doi
q.push(make_pair(b.left(),u.second+1));
q.push(make_pair(b.right(),u.second+1));
}
}
//system("pause");
return 0;
}

Tc gi: V nh Trung

Bi 5. 3478. Xy dng thnh ph - http://vn.spoj.pl/problems/NKCITY/


Nc Anpha ang lp k hoch xy dng mt thnh ph mi v hin i. Theo k
hoch, thnh ph s c N v tr quan trng, c gi l N trng im v cc trng im
ny c nh s t 1 ti N. B giao thng lp ra mt danh sch M tuyn ng

31
hai chiu c th xy dng c gia hai trng im no . Mi tuyn ng c mt
thi gian hon thnh khc nhau.
Cc tuyn ng phi c xy dng sao cho N trng im lin thng vi nhau. Ni
cch khc, gia hai trng im bt k cn phi di chuyn c n nhau qua mt s
tuyn ng. B giao thng s chn ra mt s tuyn ng t trong danh sch ban u
a vo xy dng sao cho iu kin ny c tha mn.
Do nhn c u t rt ln t chnh ph, b giao thng s thu hn mt i thi cng
ring cho mi tuyn ng cn xy dng. Do , thi gian hon thnh ton b cc
tuyn ng cn xy dng s bng thi gian lu nht hon thnh mt tuyn ng no
.
Yu cu: Gip b giao thng tnh thi gian hon thnh cc tuyn ng sm nht tha
mn yu cu nu.
D liu
Dng cha s N v M (1 N 1000; 1 M 10000).
M tip theo, mi dng cha ba s nguyn u, v v t cho bit c th xy dng tuyn
ng ni gia trng im u v trng im v trong thi gian t. Khng c hai tuyn
ng no ni cng mt cp trng im.
Kt qu
Mt s nguyn duy nht l thi gian sm nht hon thnh cc tuyn ng tha mn
yu cu nu.
V d
D liu
57
122
151
251
143
132
532
344
Kt qu
3

32
Time: 1s
Gii
bi kh di nhng tm li mc tiu ca ta l phi tm ra 1 phng n xy
dng hon thnh trong thi gian ngn nht i qua tt c cc trng im, ngha l thi
gian lu nht hon thnh 1 tuyn ng no trong phng n phi l nh nht
trong tt c cc phng n xy dng c th. Ni cch khc chnh l tm cy khung nh
nht ca th, sau a ra trng s ln nht trn cy khung . Ta s p dng gii
thut PRIM nh sau.
2
3

1
1
1

2
5

1
5

2
4

4
4

u tin xt cc nh k nh 1 cho vo hng i, chn tip nh 5 v trng s


cnh 1->5 l nh nht trong s cc cnh xut pht t nh 1.
Tip tc xt cc nh k 5 cho tip vo hng i, chn tip nh 2 vi l do nh
trn. C th tip tc cho n khi chn cc nh.
Trong s cc cnh chn th cnh 1->4 c trng s ln nht bng 3 l kt qu
cn tm ca bi ton.
Ta s ci t bi ny s dng hng i u tin priority_queue trong th vin
STL ca C++. Ch l vi hng i u tin th mc nh n s sp xp gim dn theo
tham s u tin, v d priority_queue< pair<int, int> > q; s sp xp theo tham s
kiu int u tin. Nu ta mun ly ra gi tr nh nht u hng i th ch vic i
du gi tr truyn vo hng i.
Ci t ca bi ny nh sau ng theo t tng thut ton trnh by trn
(time: 0.60s):

33
#include <iostream>
#include <vector>
#include <queue>
#define MIN -2147483647
using namespace std;
int main()
{
int n,m;
int u, v, t;
cin>>n>>m;
//doan khai bao sau tuong duong voi mang 2 chieu
vector< vector< pair<int, int> > > dinh(n);
//mang danh dau cac dinh da xet
vector< bool > daxet(n);
pair<int, int> ts;
for(int i=0; i<m; ++i)
{
cin>>u>>v>>t;
ts = make_pair(v-1,t);
dinh[u-1].push_back(ts);
ts = make_pair(u-1,t);
dinh[v-1].push_back(ts);
}
//khoi tao bien dem so dinh da duyet u
u = 0;
//khoi tao bien t luu trong so lon nhat tren tuyen
duong di nho nhat
t = -MIN;
//khoi tao hang doi- duyet tu dinh 0
ts = make_pair(MIN,0);
priority_queue< pair<int, int> > q;
q.push(ts);
while(!q.empty())
{
ts = q.top();
q.pop();
v = ts.second;
if(!daxet[v])
{
//tang so dinh da duoc chon len
++u;
//luu lai gia trong so max
if(ts.first < t && ts.first!=MIN)
t = ts.first;
//da duyet xong thoat khoi vong lap
if(u == n) break;
//danh dau dinh da xet
daxet[v] = true;
//dua cac dinh ke voi dinh dang xet vao hang
doi
for(int i=0; i< dinh[v].size(); ++i)
if(!daxet[dinh[v][i].first])

34
q.push(make_pair(-dinh[v][i].second,
dinh[v][i].first));
}
}
cout<<-t;
return 0;
}

Ch :
gim thi gian cc bn hy th chuyn ton b cin, cout thnh scanf, v
printf (time: 0.22s).
Mt cch khai bo hng i khc mc nh sp xp theo chiu tng dn
l: priority_queue< int, vector< pair<int, int> >, greater< pair<int, int> > >
(mc nh l less< pair<int, int> >)
Tc gi: V nh Trung
Bi 6. 3125. n trng - http://vn.spoj.pl/problems/QBSCHOOL/
Ngy 27/11 ti l ngy t chc thi hc k I trng H BK. L sinh vin nm
th nht, Hiu khng mun v i mun m gp trc trc phng thi nn chun b
kh k cng. Ch cn li mt cng vic kh gay go l Hiu khng bit i ng no ti
trng l nhanh nht.
Thng ngy Hiu khng quan tm ti vn ny lm cho nn by gi Hiu
khng bit phi lm sao c . Bn thnh ph l gm c N nt giao thng v M con
ng ni cc nt giao thng ny. C 2 loi con ng l ng 1 chiu v ng 2
chiu. di ca mi con ng l mt s nguyn dng.
Nh Hiu nt giao thng 1 cn trng H BK nt giao thng N. V mt l
trnh ng i t nh Hiu ti trng c th gp nhiu yu t khc nh l gp nhiu
n , i qua cng trng xy dng, ... phi gim tc cho nn Hiu mun bit l
c tt c bao nhiu l trnh ngn nht i t nh ti trng. Bn hy lp trnh gip Hiu
gii quyt bi ton kh ny.
Input
Dng th nht ghi hai s nguyn N v M.
M dng tip theo, mi dng ghi 4 s nguyn dng K, U, V, L. Trong :

35
K = 1 c ngha l c ng i mt chiu t U n V vi di L.
K = 2 c ngha l c ng i hai chiu gia U v V vi di L.
Output
Ghi hai s l di ng i ngn nhn v s lng ng i ngn nht. Bit rng s
lng ng i ngn nht khng vt qu phm v int64 trong pascal hay long long
trong C++.
Example
Input:
32
1123
2231
Output:
41
Gii hn:
1 N 5000
1 M 20000
di cc con ng 32000
Time: 1s
Gii
y l bi thuc dng tm ng i ngn nht trn th c trng s khng m
nn ta s s dng thut ton Dijkstra, tuy nhin phi ci tin mt cht c th a ra
c s lng ng i ngn nht tm c nh sau:
Ta s gn nhn tm thi cho cc nh - nhn ca mi nh cho bit di
ng i ngn nht hin thi ti nh v s dng mt mng m s lng ng
i ngn nht ti mi nh.
Ti mi lt ta s ly ra nh c nhn nh nht trong hng i v tip tc ly
cho n khi c nh cha xt th gn nh thnh xt. Gi s nh ly ra l nh
u cha xt th lc ny gn u thnh xt v duyt qua cc nh k vi nh u, gi s v
k u cp nht li nhn cho nh ny nh sau

36
Nu nhn ca v > nhn ca u + trng s cnh (u,v) th gn li nhn ca v = nhn
ca u + trng s cnh (u,v) v s ng i ngn nht n v = s ng i ngn
nht n v. a nh v vo hng i.
Nu nhn ca v = nhn ca u + trng s cnh (u,v) th gn li nhn ca v = nhn
ca v + nhn ca u.
C nh vy cho n khi duyt ht nh cui cng th nhn ca nh cui cng - chnh
l nt giao thng th N. Kt qu ca bi ton chnh l nhn ti nh N v m ti nh
N. Ci t s dng priority_queue nh sau (time: 0.56s):
#include <iostream>
#include <vector>
#include <queue>
#include <list>
#define MaxN 5002
#define MAX 2147483647
using namespace std;
bool daxet[MaxN];
long long dem[MaxN];
int dist[MaxN];
list< pair<int,int> > dinh[MaxN];
pair<int,int> ts;
int main()
{
int n,m;
int k, u, v, d;
scanf("%d%d",&n,&m);
for(int i=0; i<m; ++i)
{
scanf("%d%d%d%d",&k,&u,&v,&d);
dinh[u].push_back(make_pair(d,v));
if(k==2)
dinh[v].push_back(make_pair(d,u));
}
for(int i=1;i<=n;++i)
dist[i] = MAX;
list<pair<int,int> >::iterator it;
priority_queue< pair<int,int>, vector< pair<int,int>
>, greater<pair<int,int> > > q;
q.push(make_pair(0,1));
dist[1] = 0;
dem[1] = 1;
while(!q.empty())
{
ts = q.top();
q.pop();
d = ts.first;
u = ts.second;

37
if(daxet[u]) continue;
daxet[u]= true;
for(it=dinh[u].begin(); it!=dinh[u].end(); ++it)
{
v = (*it).second;
k = (*it).first;
if(dist[v] > d + k)
{
dist[v] = d + k;
dem[v] = dem[u];
q.push(make_pair(dist[v],v));
}
else if(dist[v] == d + k)
dem[v]+= dem[u];
}
if(u==n)
{
printf("%d %lld",dist[n],dem[n]);
break;
}
}
return 0;
}

Tc gi: V nh Trung

PHN IV. QUY HOCH NG


Bi 1. 2356. Lt gch - http://vn.spoj.pl/problems/LATGACH/
Cho mt hnh ch nht kch thc 2xN (1<=N<=100). Hy m s cch lt cc vin
gch nh kch thc 1x2 v 2x1 vo hnh trn sao cho khng c phn no ca cc vin
gch nh tha ra ngoi, cng khng c vng din tch no ca hnh ch nht khng
c lt.
Input
Gm nhiu test, dng u ghi s lng test T ( T<=100 ).
T dng sau mi dng ghi mt s N.
Output
Ghi ra T dng l s cch lt tng ng.
Example
Input:

38
3
1
2
3
Output:
1
2
3
Time: 1s
Gii
u tin ta xt hnh ch nht 2x1 th c 1 cch xp l xp 1 vin gch 2x1.
Xt hnh ch nht 2x2 th c 2 cch xp l xp 2 vin 1x2 hoc 2 vin 2x1.
Xt hnh ch nht 2xi c cc trng hp sau vi f(i) l s cch xp cho hnh ch nht
2xi.
2x(i-1)

2x1

f(i-1) cch xp

2x(i-2)

1x2

f(i-2) cch xp

1x2

=> f(i) = f(i-1) + f(i-2) vi f(1) = 1 v f(2) = 2


=> f(N) l kt qu ca bi ton
Cng thc truy hi trn chnh l cng thc ca dy Fibonacy ni ting.
Gii hn ca bi ny l N<=100, do f(N) s rt ln ta phi s dng cch cng s ln
theo kiu cng mng cc ch s.
Ci t ca hm cng 2 vector lu cc ch s ca 2 s nguyn ln nh sau:
const int cs=10;
vector<int> cong(vector<int> b1, vector<int> b2)
{
int n1 = b1.size();
int n2 = b2.size();
int n = n1>n2?n1:n2;
vector<int> kq(n);
int nho=0,k;
for(int i=0; i<n; ++i)
{
if(i<n1 && i<n2)
{

39
k = b1[i] + b2[i] + nho;
kq[i] = k%cs;
nho = k/cs;
}
else if(i<n1)
{
k = b1[i] + nho;
kq[i] = k%cs;
nho = k/cs;
}
else if(i<n2)
{
k = b2[i] + nho;
kq[i] = k%cs;
nho = k/cs;
}
}
if(nho>0)
{
kq.push_back(nho);
}
return kq;
}

Sau khi c hm cng s ln ri th mi vic cn li kh n gin. Ci t nh sau


(time: 0.00s ):
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int k,n;
cin>>k;
vector< vector<int> > kq;
vector<int> b1;
vector<int> b2;
b1.push_back(1);
b2.push_back(2);
kq.push_back(b1);
kq.push_back(b2);
for(int i=2; i<100; ++i)
kq.push_back(cong(kq[i-1],kq[i-2]));
for(int i=0; i<k; ++i)
{
cin>>n;
for(int j= kq[n-1].size()-1; j>=0; --j)
cout<<kq[n-1][j];
cout<<endl;
}
//system("pause");
return 0;

40
}

Tc gi: V nh Trung
Bi 2. 3883. Lt gch 3 - http://vn.spoj.pl/problems/M3TILE/
m s cach lat hinh ch nht 3xn bng cac domino 2x1?

D liu vao gm nhiu testcase kt thuc la s -1.


Mi testcase la mt s nguyn n, 0 n 30.
Vi mi test case, in ra s nguyn la ap s trn mt dong.

SAMPLE INPUT
2
8
12
-1
SAMPLE OUTPUT
3
153
2131
Time: 1s
Ch : n=0 kt qu tr v l 1.
Gii
Bi ny th vi n l th s 1x1 l l trong khi cc con domio u c 2 , tng ca
chng lun lun chn, nn kt qu bi ton tr v l 0 c cch xp no ph hp. Do
ta ch xt vi n chn.
u tin xt hnh ch nht 3x2, d dng nhn thy c 3 cch xp sau :

41
Xt tip hnh ch nht 3x4, c cc trng hp sau:
3
x
2

3
x
2

3 x 3 = 9 cch + 2 cch => 11 cch


Xt tip hnh ch nht 3x6, ta c cc trng hp sau:

Nu gi f(k) l s cch lt hnh ch nht 3xk th ta c:


f(6) = f(2) * f(6-2) + 2*[ f(6-4) + f(6-6) ] = 3*11 + 2*(3+1) = 41 cch.
Tng qut ta c:
f(k) = 3*f(k-2) + 2*[ f(k-4) + f(k-6) + .. + f(0) ]
f(k) + f(k-4) = 3*f(k-2) + 3*f(k-4) + 2*[ f(k-6) + f(k-8) + .. + f(0) ]
f(k) + f(k-4) = 3*f(k-2) + f(k-2) = 4*f(k-2)
f(k) = 4*f(k-2) - f(k-4)
Nh vy l ta tm c cng thc truy hi ngn gn nh sau:
f(k) = 4*f(k-2) - f(k-4) vi f(0) = 1, f(2) = 3
f(n) chnh l li gii cho bi ton. Ci t nh sau (time: 0.01s ):
#include<stdio.h>
int main()
{
int n,i;
int f[31]={0};
f[0]=1;
f[1]=0;
f[2]=3;
f[4]=11;

42
for(i=6;i<=30;i+=2)
{
f[i]=4*f[i-2] - f[i-4];
}
scanf("%d",&n);
while(n!=-1)
{
printf("%d\n",f[n]);;
scanf("%d",&n);
}
return 0;
}

Tc gi: V nh Trung
Bi 3. 2795. Steps - http://vn.spoj.pl/problems/VSTEPS/
Bc thang
Bm chi tr chi in t Lucky Luke n mn phi iu khin Lucky leo ln mt cu
thang gm n bc.
Cc bc thang c nh s t 1 n n t di ln trn. Lucky c th i ln mt bc
thang, hoc nhy mt bc ln hai bc thang. Tuy nhin mt s bc thang b thng
do c k v Lucky khng th bc chn ln c. Bit ban u, Lucky ng bc
thang s 1 (bc thang s 1 khng bao gi b thng).
Chi n y, Bm cht ny ra cu hi: c bao nhiu cch Lucky leo ht c cu
thang? (ngha l leo n bc thang th n). Bm mun nh bn tr li cu hi ny.
D liu

Dng u tin: gm 2 s nguyn n v k, l s bc ca cu thang v s bc thang


b hng (0 k < n 100000).

Dng th hai: gm k s nguyn cho bit ch s ca cc bc thang b hng theo


th t tng dn.

Kt qa
In ra phn d ca s cch Lucky leo ht cu thang khi chia cho 14062008.
V d
D liu
42
23

43
Kt qa
0
D liu
90000 1
49000
Kt qa
4108266
Time: 1s
Gii
Bi ny c cng thc ging ca dy Fibonacy. Khi ta ng bc n-1 th ta c th i
ln 1 bc n bc n, cn khi ta ng bc n-2 th ta c th di chuyn ln 2 bc
n bc n. Tuy nhin ta phi xt n cc trng hp m bc thang b hng th khng
c cch no bc ln c, ch c th nhy 2 bc qua v nu 2 bc lin tip m
b hng th r rng l phi dng li. Ch l phi ly phn d khi chia s cch cho
14062008. Ci t nh sau (time: 0.07s):
#include<stdio.h>
#define sc 14062008
int main()
{
int i,n,k;
unsigned long long a[100001];
int tmp;
a[0] = 0;
a[1] = 1;
scanf("%d%d",&n,&k);
for(i=k-1; i>=0; --i)
{
scanf("%d", &tmp);
a[tmp] = -1;
}
for(i=2; i<=n; i++)
{
if(a[i] == -1)
{
//printf("-1\n");
continue;
}
if(a[i-1] == -1 && a[i-2] == -1)
{
a[n] = 0;
break;
}

44
else if(a[i-1] == -1)
a[i] = a[i-2];
else if(a[i-2] == -1)
a[i] = a[i-1];
else
a[i] = (a[i-1] + a[i-2]) % sc;
//printf("%ld\n",a[i]);
}
printf("%ld\n", a[n] % sc);
//system("pause");
return 0;
}

Tc gi: V nh Trung
Bi 4. 2782. ng i c tng ln nht - http://vn.spoj.pl/problems/QBMAX/
Cho mt bng A kch thc m x n (1 <= m, n <= 100), trn ghi cc s nguyn a ij (|
aij| <= 100). Mt ngi xut pht ti no ca ct 1, cn sang ct n (ti no cng
c).
Quy tc i: T (i, j) ch c quyn sang mt trong 3 (i, j + 1); (i - 1, j + 1); (i + 1,
j + 1)
Input
Dng 1: Ghi hai s m, n l s hng v s ct ca bng.
M dng tip theo, dng th i ghi n s trn hng i ca bng theo ng th t t tri
qua phi
Output
Gm 1 dng duy nht ghi tng ln nht tm c
Example
Input:
57
9 -2 6 2 1 3 4
0 -1 6 7 1 3 3
8 -2 8 2 5 3 2
1 -1 6 2 1 6 1
7 -2 6 2 1 3 7
Output:
41

45
Time: 1s
Gii
y l bi dng quy hoch ng trn bng. Quy tc ca bi ny c th thy r trong
bng bn di:
j\i

-2

-1

-2

-1

-2

Nh vy l t 1 ta c th i sang cc trn, phi, di ct bn k bn phi, cng


c ngha l 1 c th c n t cc trn, tri, di ct k bn tri.
V ta phi tm tng ln nht nn ti mi ta phi tm tng ln nht trong s tng ca
cc trn, tri, di ct k bn tri, ri cng vi gi tr ti l ra tng ln nht
phi tm ti . Vi bng gi tr trn ta c bng quy hoch nh sau:
j\i

INT_MI
N

INT_MI
N

INT_MI
N

INT_MI
N

INT_MI
N

INT_MI
N

INT_MI
N

INT_MI
N

14

16

24

27

35

14

23

24

31

34

16

18

28

31

36

13

18

19

34

35

13

15

19

22

41

INT_MI
N

INT_MI
N

INT_MI
N

INT_MI
N

INT_MI
N

INT_MI
N

INT_MI
N

INT_MI
N

Kt qu ca bi ton l gi tr ln nht ti ct ngoi cng bn phi, y l gi tr 41.


Ci t nh sau (time: 0.02s):
#include <stdio.h>
#define INT_MIN -2147483647
int m,n;
int a[100][100];
int b[102][101];

46
int main()
{
int i,j,s;
scanf("%d%d",&m,&n);
for(i=0; i<m; ++i)
{
for(j=0; j<n; ++j)
scanf("%d",&a[i][j]);
}
for(i=0; i<=m; ++i)
b[i][0] = 0;
for(i=1; i<=n; ++i)
{
b[0][i] = INT_MIN;
b[m+1][i] = INT_MIN;
}
for(i=1; i<=n; ++i)
{
for(j=1; j<=m; ++j)
{
s = INT_MIN;
if(s < b[j][i-1]) s = b[j][i-1];
if(s < b[j-1][i-1]) s = b[j-1][i-1];
if(s < b[j+1][i-1]) s = b[j+1][i-1];
b[j][i] = a[j-1][i-1] + s;
}
}
/*for(i=0; i<=m+1; ++i)
{
printf("\n");
for(j=0; j<=n; ++j)
printf("%-13d", b[i][j]);
}*/
s = INT_MIN;
for(i=1; i<=m; ++i)
if(s < b[i][n])
s = b[i][n];
printf("%d",s);
return 0;
}

Tc gi: V nh Trung

PHN V. CC BI TON KHC


Bi 1. u gi - Chuyn tin 2010

47
S giao thng H Ni quyt nh bn u gi cc bin s xe p ly tin ng h
ng bo l lt min Trung. Mt bin s xe c gi l p nu n tha mn cc iu
kin sau:
L mt s nguyn dng T m A T B trong A, B l hai s nguyn
dng cho trc;
T l mt s nguyn t;
T l mt s i xng (c T t tri qua phi thu c kt qu ging nh c
T t phi qua tri). V d 12321 l mt s i xng.
Yu cu: Cho hai s nguyn dng A v B, hy tm s lng cc bin s xe p.
D liu: Vo t file vn bn AUCTION.INP gm 1 dng cha hai s nguyn dng A
v B(104A<B<105).
Kt qu: a ra file vn bn AUCTION.OUT mt s nguyn l s lng bin s xe
p tm c.
V d:
AUCTION.INP
11111 22222

AUCTION.OUT
23

Time : 2s
Gi gii
Bi ny trc tin ta s vit hm kim tra tnh i xng ca mt s c 5 ch s. Hm
ny ta c th chuyn s nguyn a thnh chui s s[6] (dng hm sprintf(s , %d, a) )
hoc s dng cc php ton chia v ly phn d tch cc ch s ca a, ri kim tra
nu ch s ti v tr 0 v 4 ging nhau v ch s ti v tr 1 v 3 ging nhau th tr v
true, ngc li tr v false.
Tip theo ta phi vit hm kim tra tnh nguyn t ca s nguyn a. n gin ch cn
kim tra nu a chia ht cho bt k s nguyn no trong on t 2 n cn bc hai ca a
th tr v false ngc li tr v true.
Cui cng ch cn duyt t A n B v m cc s tha mn i xng v l s nguyn
t.

48
Bn c t ci t.
Tc gi: V nh Trung
Bi 2. Trng xe - Chuyn tin 2010
Mt bi xe nhn trng xe trong vng mt thng. Mi xe s c gn mt s hiu l
mt snguyn dng T (10102010 T 10109999). Hai xe khc nhau s c gn
hai s hiu khc nhau.
Mt xe c th ra vo bi xe nhiu ln, mi ln vo bi xe, ngi trng xe s ghi
vo s sch s hiu ca chic xe .
Cui thng da vo s ghi chp, ngi trng xe lm thng k v s ln vo bi xe
ca tng chicxe tin hnh thu ph. Nu mt chic xe vo bi xe p ln, cui
thng ch xe phi tr mt lng ph C c tnh nh sau:
C = 100

nu p 5

C = 100 + ( 5) nu p > 5
Yu cu: Tnh tng s ph ngi trng xe thu c vo cui thng.
D liu: Vo t file vn bn PARK.INP c dng:
Dng u cha mt s nguyn dng K (0 < K 106)
K dng tip theo, mi dng cha s hiu mt chic xe .
Kt qu: a ra file vn bn PARK.OUT mt s nguyn l tng s ph thu c.
V d:
PARK.INP
7
10102010
10108888
10102010
10102010
10102010
10102010
10102010
Time : 2s

PARK.OUT
201

49
Gi gii
Ta thy gii hn ca bi ton = 10109999 - 10102010 + 1 = 7990 v k <10 6 nn hon
ton c th p dng vic m theo ch s.
Trc tin ta khai bo mt mng int dem[7991]. c cc u vo n tm maxn v
minn. Khi xt s hiu ca 1 chic xe no v d l n ta ch vic tng dem[n20102010] ln 1.
Cui cng duyt li mng dem[] t s hiu nh nht (minn) n cao nht (maxn)
tnh tng chi ph thu c.
Tc gi: V nh Trung
Bi 3. 3480. Cy nh phn tm kim - http://vn.spoj.pl/problems/NKTREE/
Mt trong nhng cu truc d liu ni ting lu tr d liu la cy nhi phn
tim kim. Mi nt trn cy c nhiu nht l hai nt con v nhiu nht l mt nt cha.
Cc nt con c chia thnh hai loi: nt con tri v nt con phi. Mi cy tm kim
c mt nt khng c nt cha gi l nt gc, v c t nht mt nt khng c nt con gi
l nt l.
Mi mt nt c gn mt gi tr no tha iu kin sau: Ti mt nt v bt k
tt ca cac gi tr thuc cy con trai vi gc v nho hn gi tr ti nt v, va tt ca cac gi
tr cc nt thuc cy con bn phai vi gc v ln hn gi tr ti nut v.
Hinh bn di m ta mt cy nhi phn tim kim trong nt c gi tr 5 l gc,
cc nut vi gi tr 2, 4 va 8 l cc nt l.
5

4
ng i trn cy la day cac gi tr ti cc nt lin tip, trong o mi nt sau la
nt con trc tip ca nt trc .

50
Yu cu: Cho mt day gm cc gi tr i mt khc nhau. Hy cho bit tn tai hay
khng cy tim kim nhi phn, m trn tn ti mt ng i vi dy gi tr tng
ng l dy cho.
Vi du, tn ti cy nh phn tm kim vi day 5 1 3 2, cn khng tn ti cy nh phn
tm kim vi dy 5 2 3 1.
D liu
Ln lt lit k cc gi tr ca dy cho. Hai phn t c ghi cch nhau bi khong
trng hoc du xung dng. S lng phn t ca dy khng vt qu 50 000 v mi
phn t ca dy c gi tr tuyt i khng vt qu 231.
Kt qu
Ghi ra t YES, nu tn ti cy, tng ng dy cho hoc t NO trong trng
hp ngc lai.
Vi du
D liu
D liu
5132
5231

Kt qu
YES
NO

Time: 1s
Gi gii
Vi bi ny chng ta cn quan tm n cc gi tr l gi tr min hin ti, max hin
ti, gi tr nt cha trc tip v gi tr nt con ang xt. C th thy r hn hnh di:
5

(min,max)

(min, 5)

Nhn vo cy ny ta thy nu gi Min 3l gi(1,tr5)nh nht (khi to bng m v cng),


Max l gi tr ln nht (khi to bng dng v cng), b l gi tr trc (nt cha
trc tip), c l gi tr nt con ang xt, th c cc trng hp sau:
(1, 3)
(3, 5)
2
?

51
Nu c=b hoc c<=Min hoc c>=Max th p n bi ton l NO dng c d
liu.
Nu c thuc khong (Min, Max) v c < b th gn li Max = b
Nu c thuc khong (Min, Max) v c > b th gn li Min = b
Cui cng nu tt c cc gi tr c c u tha mn th in ra YES.
Ch : c d liu bi ny l c cho n khi ht d liu nn trong C ta c th dng
vng lp while(scanf(%f, &c) >0){ } hoc trong C++ dng while((cin>>c)>0) { }.
y phi dng kiu float trong C hoc long long trong C++ cho cc bin v kh nng
b test ca bi ny b sa, c gi tr vt qu kiu s nguyn 32 bit.
Tc gi: V nh Trung
Bi 4. 2786. Cy khung nh nht (HEAP) - http://vn.spoj.pl/problems/QBMST/
Cho n th v hng lin thng G = (V, E) gm n nh v m cnh, cc nh c
nh s t 1 ti n v cc cnh c nh s t 1 ti m. Hy tm cy khung nh nht
ca th G
Input
Dng 1: Cha hai s n, m (1 <= n <= 10000; 1 <= m <= 15000)
M dng tip theo, dng th i c dng ba s nguyn u, v, c. Trong (u, v) l ch s hai
nh u mt ca cnh th i v c trng s ca cnh (1 <= u, v <= n; 0 <= c <=
10000).
Output
Gm 1 dng duy nht: Ghi trng s cy khung nh nht
Example
Input:
69
121
131
241
232
251

52
351
361
452
562
Output:
5
Time: 1s
Gi gii
Tng t bi NKCITY trong phn TH, ch c khc l kt qu tr v l tng
trng s ca cy khung nh nht.
Tc gi: V nh Trung
Bi 5. 4031. Mass of Molecule- http://vn.spoj.pl/problems/MMASS/
Hoa cht chi gm cac nguyn t C, H, O co trong lng 12,1, 16 tng ng.
No c biu din dang "nen", vi du COOHHH la CO2H3 hay CH (CO2H) (CO2H)
(CO2H) la CH(CO2H)3. Nu dang nen thi s ln lp >=2 va <=9.
Tinh khi lng hoa cht.
Input
Gm mt dong m ta hoa cht khng qua 100 ki t chi gm C, H, O, (, ), 2,..,9.
Output
Khi lng cua hoa cht, lun <=10000.
Sample
MASS.IN

MASS.OUT

COOH
CH(CO2H)3
((CH)2(OH2H)(C(H))O)3

45
148
222

Time: 1s
Gi gii
C ch gii bi ny ging vi kiu ngn xp - stack, vo sau ra trc.
u tin ta s c ton b xu: s, sau xt ln lt cc k t trong xu: s[i], c cc
trng hp sau:

53
Nu s[i] = ( th ta a vo stack gi tr 0
Nu s[i] [2,9] th ly gi tr cui stack ra nhn vi gi tr tng ng s[i] 0, ri ly kt qu a vo stack.
Nu s[i] {C, O, H] th a vo stack trng lngj ca nguyn t
Nu s[i] = ) th ta ly ln lt cc gi tr cui stack ra ng thi tnh tng
ca cc gi tr ny cho n khi ly ra gi tr 0, ri li a vo stack tng va tm
c.
Duyt xong ta s tnh tng cc gi tr cn li trong stack => khi lng ca ha cht.
Minh ha vi v d s 2 trn:
s[i]
C
H
(
C
O
2
H
)
3

Stack
{12}
{12, 1}
{12, 1, 0}
{12, 1, 0, 12}
{12, 1, 0, 12, 16}
{12, 1, 0, 12, 32}
{12, 1, 0, 12, 32, 1}
{12, 1, 45}
{12, 1, 135} = 148
Tc gi: V nh Trung

You might also like