laptrinh-01-2012

Upload: nguyen-huu-dien

Post on 06-Apr-2018

216 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/3/2019 laptrinh-01-2012

    1/8

    LP TRNH = ++THUT TONS 1, 1 - 1 - 2012

    Nguyn Hu inhttp://nhdien.wordpress.com

    Email:[email protected]: 0989 061 951

    PROGRAMMING

    ALGORITHM

    HANOI

    Gii thiuBn th nghim cho cc bn yu thch lp trnhph thng v thi Olympic tin hc. Ti c nhlp tp ch in t vi tn nh trn (lp trangweb ring), ni dung cc bi ging lp trnh v cc

    bi thi hay. Mi cc bn tham gia v cho kin.Nhng bi tp sau y c ly t ti liu su

    tm trn mng c bin tp v sa i li vi nidung p dng cc phng php gii ca tin hc.Cc bn c cc bi hay, su tm hay gi cho ti ti a vo danh sch vi tn ch thch ca bnhoc bn su tm. C gng c 15 ngy ti ra mt

    bn lu tr. Mi thc mc v yu cu lin hvi:Nguyn Hu inHanoi University of ScienceCenter for High-Performance Computing334 Nguyen Trai, Thanh Xuan, Hanoi

    Office (84-4) 557 2869

    Danh sch bi k nyBi 1.1 i mt vng . . . . . . . . . . . . . . . . 1Bi 1.2 Tr chi . . . . . . . . . . . . . . . . . . . 3Bi 1.3 m im . . . . . . . . . . . . . . . . . 4Bi 1.4 Nhng ngi bn . . . . . . . . . . . . 5

    Bi 1.5 Tr chi . . . . . . . . . . . . . . . . . . . 7

    Danh sch chng trnh

    1 travel.c . . . . . . . . . . . . . . . . . . . . 22 game.c . . . . . . . . . . . . . . . . . . . . 43 demdiem.c . . . . . . . . . . . . . . . . . . 54 friend.c . . . . . . . . . . . . . . . . . . . . 65 game.c . . . . . . . . . . . . . . . . . . . . 7

    thi Olympic Tin hc Bungari

    Bi 1.1 (i mt vng) Nhiu ngi trong nghnghip khc nhau (ngi a th, ngi chuyn hngn tn nh, ngi bun bn, ...) thng ng trc biton: H cn khi hnh t mt im (thng l ch lm

    vic c nh: Trm a th, ca hng, kho hng hoc cquan lm vic) n mt s a im khc ca khch hngv sau h li tr v im ban u to ra mt vng. Chocc im m h i vng qua k hiu l cc s t1 n N,im u tin l s 1. Mi khong cch hai im m hci qua (k c im bt u) bit khong cch l mt snguyn (nhng cng c th l thi gian i qua khongcch ny hoc gi phi tr no i qua khong cchny). Khng nghi ng g vng i cng ngn (thi gian t

    nht, gi r nht) cng tt. Rt tic tm c ng vngtt nht khng phi l vic d khi s im phi i qua ln.Nhim v ca chng ta l vit mt chng trnh travel.exe,

    m n th tm ng trong thi gian cho php vi li giitt nht.

    Cc d liu c cho trong tp, chng trnh phic c vo. Hng u tin ca tp vo l s N(3 < N< 200) l s im m h cn i qua k c im utin. Mi Ndng sau cha ta nguyn ca im ccnhau bi k t trng. Khong cch gia hai im c tnhtheo cng thc: Nu (x1,y1) v (x2,y2) th khong cch l|x1 x2|+ |y1y1|. Tt c cc ta l s nguyn khngm v khng vt qu 10000.

    Tp ra l tp vn bn chun. N cha mt hng vihon v ca cc s t1 n Ncch nhau mt khong trngl ng i phi tm.

    V d.

  • 8/3/2019 laptrinh-01-2012

    2/8

    LP TRNH = ++THUT TONS 1, 1 - 1 - 2012

    travel.in travel.out6

    0 0

    40 0

    25 5

    20 10

    40 20

    10 20

    1 4 6 5 3 2

    Li gii 1.1. Bi ton c mt s cch tip cn. yl bi ton ngi a hng bit. Vy ta s dngthut ton tham khi duyt cc bc i. Ti mi bci im ang ng ta chn n im gn nht. Sdng l thuyt th trin khai nh sau:

    Chng trnh 1: travel.c1 #include 2 #include 3 #include 4 #include 5 #include

    7 #define MAXN 256

    9 typedef struct Point TPoint;10 struct Point {11 int x , y ;12 };

    14 typedef struct Vex TVex;15 struct Vex {16 int v, b;17 TEdge edges;18 };

    20 typedef struct Edge TEdge;21 struct Edge {22 int v, w;23 TEdge next;24 };

    26 int n;27 TPoint pt[MAXN];28 TVex vs[MAXN];29 clock_t s;30 int bp;31 int path[MAXN];

    33 void readf(void);34 void solve(void);35 void writef (void);

    37 int main(void) {38 readf();39 solve ();40 writef ();41 return 0;42 }

    44 void readf(void) {45 / FILEfin; /46 int i ;47 /48 fin = fopen("travel.in", "r");49 fscanf( fin , "%d", &n);50 for (i = 0; i < n; ++i)51 fscanf( fin,"%d %d\n",&pt[i].x,&pt[i ]. y) ;52 fclose (fin);53 /54 scanf("%d", &n);55 for (i = 0; i < n; ++i)56 scanf("%d%d", &pt[i].x, &pt[i ]. y) ;57 }

    59 void solve(void) {60 int i , j ;61 void add_edge(int a, int b);62 int dfs( int v, int cp, int len);63 s = clock();64 for (i = 0; i < n; ++i)65 for (j = 0; j < n; ++j)66 if (i != j)67 add_edge(i, j);68 bp = INT_MAX;69 dfs(0, 0, 1);70 }

    72 void writef (void) {73 int i ;74 printf("%d", path[0]+1);75 for (i = 1; i < n; ++i)76 printf("%d", path[i]+1);77 printf("\n");78 }

    80 void add_edge(int a, int b) {81 TEdge e, se;82 e = (TEdge)malloc(sizeof(TEdge));83 e>v = b;84 e>w = abs(pt[a].x pt[b].x)85 + abs(pt[a ]. y pt[b].y);86 for (se = &vs[a].edges;87 se&&(se)>ww; se=&(se)>next)88 ;

    Nguyn Hu in 2/8 http://nhdien.wordpress.com

  • 8/3/2019 laptrinh-01-2012

    3/8

    LP TRNH = ++THUT TONS 1, 1 - 1 - 2012

    89 e>next = se;90 se = e;91 }

    93 int dfs( int v, int cp, int len) {94 TEdge e;95 int i , u;96 clock_t c;97 if (cp < bp) {98 vs[v].v = 1;

    99 for (e = vs[v].edges; e; e = e>next)100 if (e>v == 0 && len == n) {101 if (cp + e>w < bp) {102 bp = cp + e>w;103 u = v;104 for ( i = n1; i >= 0; i) {105 path[i] = u;

    106 u = vs[u].b;107 }108 }109 }110 else if (vs[e>v].v == 0) {111 c = clock();112 if ((c s) / 1000.0 > 4.9)113 return 1;114 vs[e>v].b = v;115 if (dfs(e>v, cp + e>w, len+1))116 return 1;117 }118 vs[v].v = 0;119 }120 return 0;121 }

    Bi 1.2 (Tr chi) Mt giy k ka r thnh cc vungging nhau. Mi vung xc nh bng s hng v s ct.nh s theo hng v theo ct t1. Trn mt vung tqun c. Hai ngi chi ln lt thc hin cc bc i bngcch dch chuyn qun c. n lt i phi di chuyn qunc sao cho n cn trn cng mt hng, nhng s ca ct

    gim i mt s, m n l s chnh phng, hoc l n trncng mt ct, nhng s hng gim i mt s m n l schnh phng. Ngha l nu qun c nm ti hng i v ctj (hoc ti v tr(i, j)), th n c th dch chuyn n ti sno ti v tr(i, j 1), (i, j 4), (i, j 9), ... hoc l tiv tr no trong (i 1, j), (i 4, j), (i 9, j), ... Nhnglun lun m bo trong khung ca sn chi. Tr chi ktthc khi mt trong ngi chi t qun c vo v tr(1, 1).Ngi chi bc i sau cng l chin thng. Cng c th

    Mt v tr(i, j) gi l chin thng, nu khi t qunc vo , ngi chi bt u chi c th t chc thc

    hin sao cho dnh chin thng, khng ph thuc vo cchchi ca i th ca n. Hy vit chng trnh game.exe,m n nhp vo bn s i1, j1, i2, j2, mi s thuc tp hp{0,1, 2,..., 500} v i1 < j1, j1 < j2 v n tnh s lng vtr chin thng (i, j), m chng tha mn i1 < i < i2 vj1 < j < j2. Gi liu nhp vo l tp cha mt hng bns nguyn i1, j1, i2, j2 cch nhau du trng.

    Kt qu phi a ra tp chun cha mt s nguyn.

    V d.

    game.in game.out0 0 2 2 0

    Li gii 1.2. Tr chi ny thuc lp tr chi m vichng s lng cc tnh th nh ta c th ghic trong b nh cc thng tin v mi trng thi.Vi tr chi ny mt tnh th hoc mt v tr l cps (x,y) xc nh mt trn bn chi. Mi v tr chai gi tr thng v thua. V mi gi tr ch ra ngichi n lt ri vo v tr cho c th thng cucchi khng ph thuc vo cch chi ca i th vphi chng s b thua nu i th i bc ti u. Mtc trng quan trng khc ca tr chi l khng chutrnh (vng trn lp li) v kt thc.Ngha l, nu tmt v tr c th n mt v tr khc, th khng th tv tr th hai ny tr li v tr ban u. Ngoi ra trchi s kt sau hu hn bc khng ph thuc vocc ngi chi. Khi d thy rng phi chng mtv tr l thng hoc thua ph thuc vo cc v tr nhth no m c th t mt v tr n n. Tht vy, nu

    t mt bc i t n v tr thua, th v tr ang nl thng. Nu khng c v tr thua, n n c th tmt bc i (tt c v tr cho php l thng), th v trl thua. Ta ch rng mt v tr ch ph thuc vov tr c cc s x v y nh hn. Suy ra tnh gi trca mt v tr ch cn tnh v tr c ch s x v y nhhn l . iu ny ch ra rng mt cch tnh cc vtr l theo hng tng ca cc ch s. Ch cn xc nhv tr c s, t n ln lt tnh cc im cn li. Hin

    nhin v tr c s l (1, 1) v hn th, n l im thuav ngi chi ri vo im ny coi nh thua trn.

    Trin khai m t trn bng trc tip. Trc tin ta

    Nguyn Hu in 3/8 http://nhdien.wordpress.com

  • 8/3/2019 laptrinh-01-2012

    4/8

    LP TRNH = ++THUT TONS 1, 1 - 1 - 2012

    tnh gi tr ca tt c cc v tr vi x v y trong khong[1, i2) [1, j2). iu ny thc hin bng ba vng lp.Mt vng cho x, mt vng cho y v vng th ba duytcc vung ca cc s 1, 2, 3, .... Sau s duyt bngtrong khong [1, i2) [1, j2) v m v tr thng.

    Chng trnh 2: game.c1 #include 2 #undefmax3 #define MAXN 5124 #define MAXS 325 int i 1 , j 1 , i 2 , j 2 ;6 int sq[ MAXS], a[MAXN][MAXN];7 int ans;

    9 void readf(void);

    10 void solve(void);11 void writef (void);

    13 int main(void) {14 readf();15 solve ();16 writef ();17 return 0;18 }

    20 void readf(void) {

    21 scanf("%d%d%d%d", &i1, &j1, &i2, &j2);22 }

    24 void solve(void) {25 int i , j , k;

    27 int max(int a, int b);

    29 for ( i = 0; i < MAXS; ++i)30 sq[ i ] = (i + 1) (i + 1);

    32 for (i = 1; i < i2; ++i)33 for (j = 1; j < j2; ++j) {34 for(k = 0;isq[k]>=1&&a[isq[k]][j];++k)35 ;

    36 if ( i sq[k] >= 1)37 a[ i ][ j ] = 1;38 else {39 for(k = 0; jsq[k]>=1&&a[i][jsq[k]];++k)40 ;41 if ( j sq[k] >= 1)42 a[ i ][ j ] = 1;43 }44 }45 for (i = i1 + 1; i < i2; ++i)46 for (j = j1 + 1; j < j2; ++j)47 ans += a[i][ j ];48 }

    50 void writef (void) {51 printf("%d\n", ans);52 }

    54 int max(int a, int b) {55 return ((a > b) ? a : b);56 }

    Bi 1.3 (m im) Trong mt phng cho n imAi(xi,yi), i = 1,2, ...,n l cc nh ca a gicA1A2...An. Hy vit chng trnh points.exe tm s lngcc im c ta nguyn nm trong hoc nm trn cc

    cnh ca a gic cho.nh dng tp vo:

    D liu u vo theo tp tiu chun: Dng u tin ls n. n dng tip theo, mi dng ln lt cha cp ta xi,yi, i = 1,2, ...,n l nhng s nguyn, phn bit nhaubi du cch.

    nh dng tp ra:

    S lng tm c a ra tp chun.

    Gii hn bi ton: 3 n 1000, xi v yi l cc snguyn trong khong [104, 104].

    V d.

    point.in point.out5

    0 0

    5 0

    5 3

    3 2

    1 4

    20

    Li gii 1.3. K hiu din tch ca a gic l S. slng cc im ta nguyn trn cc cnh ca tgic l B, s im ta nguyn bn trong t gic lI. Trong hnh hc t hp c cng thc ph thuc sau:

    S =1

    2B+ I 1.

    C nhng thut ton d dng tm c cc im ta nguyn trn bin ca a gic v cng nh dintch ca a gic. Nh cng thc trn ta tnh c s

    Nguyn Hu in 4/8 http://nhdien.wordpress.com

  • 8/3/2019 laptrinh-01-2012

    5/8

    LP TRNH = ++THUT TONS 1, 1 - 1 - 2012

    im c ta bn trong a gic v bi ton nh vyc gii.

    Din tch ca a gic c tm bng cng thctnh tng ca tch: (xj xj+1) (yj + yj+1) vij = 1,2, ...,N (N+ 1 trng vi 1). Thut ton ny c

    phc tp O(N). Kt qu tnh tng trn ly gi trtuyt i cho ta hai ln din tch ca a gic.

    Tm cc im nguyn trn cc cnh a gic tathc hin tm chng trong mi cnh v cng thmN (cc im nh ca t gic). Ta bit rng s lngcc im nguyn trn mt on thng bng c schung ln nht ca hai hiu ta x v y haiu on thng tr i 1. Ngha l ta s c tnggcd(|xj xj+1|,yj yj+1) 1 vi j = 1,2, ...,N(N+ 1

    tng ng vi 1), y k hiu gcd l hm c schung ln nht.

    Chng trnh 3: demdiem.c1 #include 2 #include 3 using namespace std;4 const int maxn = 1001;5 struct Point6 {7 int x , y ;8 };9 int n;

    10 Point ps[maxn];11 void solve ();

    13 int main()14 {15 solve ();16 return 0;17 }

    19 void solve ()20 {21 int i , a2 , b;

    22 int area2();23 int border();24 scanf("%d", &n);25 for (i = 0; i < n; i++)26 scanf("%d%d", &ps[i].x, &ps[i ]. y) ;27 ps[n] = ps[0];28 a2 = area2();29 b = border();30 i = (a2 b + 2) / 2;31 printf("%d\n", b + i);32 }

    34 int area2()35 {36 int i , a;37 for (i = a = 0; i < n; i++)38 a += (ps[i].x ps[i+1].x)(ps[ i ]. y39 + ps[i+1].y);40 return abs(a);41 }

    43 int gcd(int a, int b)44 {45 int t ;46 while (b)47 {48 t = b;49 b = a % b;50 a = t;51 }52 return a;53 }

    55 int border()56 {57 int i , b ;58 for (i = b = 0; i < n; i++)59 b += gcd(abs(ps[i].x ps[i+1].x),60 abs(ps[ i ].y ps[i+1].y));61 return b;62 }

    Bi 1.4 (Nhng ngi bn) Trong mt thnh ph cs dn N, mt s cp trong bit rng l nhng ngibn. T mt cu trit l "Nhng bn ca cc ngi bn til bn ca ti" ngha l nu A v B l nhng ngi bnv B v C l nhng ngi bn, th A v C cng l nhng

    ngi bn.Hy lp chng trnh FRIEND.EXE, m n tm ra

    s lng nhng ngi bn trong nhm ln nht ca cc

    nhm nhng ngi bn khc nhau.

    nh dng tp vo: Dng th nht cha cc s Nv M, y N l s dn ca thnh ph (10 N 30000), cnM(0 M 500000) l s lng cc cp ngi bn bit. Mi dng trong M dng sau c 2 s l s ca cp

    bn A, B (1

  • 8/3/2019 laptrinh-01-2012

    6/8

    LP TRNH = ++THUT TONS 1, 1 - 1 - 2012

    ln nht nhng ngi to ra nhm ngi bn ln nht.

    V d.

    friend.in friend.out30 3

    3 4

    7 8

    3 2

    3

    Li gii 1.4. Ta biu din nhng ngi trong biton nh l nhng nh ca th, cn quan h ngi

    bn nh cc cnh ca hai nh. Trong biu din th nh vy cu:"Nhng bn ca cc ngi bn til bn ca ti" c th pht biu nh sau: Hai nhl "nhng ngi bn" nu tn ti mt ng i gia

    chng. Nhm nhng ngi bn l tp hp con cacc nh th, m trong n gia hai nh c ngivkhngcnhnonmngoitphpnymtnh ny li c ng i ti mt nh trong tp hp.Tp hp nh vy ta gi l mt thnh phn lin thngv d dng tm c thnh phn lin thng v kimtra nh bt k no c nm trong thnh phn linthng ny hay khng.Nh vy thng qua tm kimtheo chiu su bng cch nh du cc nh iqua.

    Li gii th hin trc tip cc tng trn. Ta xydng th nh danh sch nh k nhau bng cchmi nh gi danh sch nhng nh k vi n. Sau t nhng nh cha i qua ca th thng qua tmkim theo chiu su, ta s i qua tt c t n c th ic vi m s lng ca chng v ghi li nh l ccnhiqua.Vimilntmkimtheochiusutatm ra s lng cc nh trong thnh phn lin thngv li gii ca bi ton l s lng ln nht trong cc

    thnh phn lin thng ca th.

    Chng trnh 4: friend.c1 #include 2 #include

    4 #define MAXN 32768

    6 typedef struct Vex TVex;7 typedef struct Edge TEdge;

    9 struct Vex {10 int v;11 TEdge edges;12 };

    14 struct Edge {15 int v;16 TEdge next;17 };

    19 int n, m;20 TVex vs[MAXN];21 TEdge es;22 int ec;23 int csize , ans;

    25 void readf(void);26 void solve(void);27 void writef (void);

    29 int main(void) {30 readf();31 solve ();32 writef ();

    34 return 0;35 }

    37 void readf(void) {38 int i , a , b;

    40 void add_edge(int a, int b);

    42 scanf("%d%d", &n, &m);43 es=(TEdge)malloc(sizeof(TEdge)2m);44 for (i = 0; i < m; ++i) {45 scanf("%d%d", &a, &b);46 a;47 b;48 add_edge(a, b);

    49 add_edge(b, a);50 }51 }

    53 void solve(void) {54 int i ;

    56 void dfs( int v) ;

    58 for (i = 0; i < n; ++i)59 if (vs[ i ]. v == 0) {60 csize = 0;61 dfs(i);62 if ( csize > ans)63 ans = csize;64 }65 }

    Nguyn Hu in 6/8 http://nhdien.wordpress.com

  • 8/3/2019 laptrinh-01-2012

    7/8

    LP TRNH = ++THUT TONS 1, 1 - 1 - 2012

    67 void writef (void) {68 printf("%d\n", ans);69 }

    71 void add_edge(int a, int b) {72 TEdge ne;

    74 ne = &es[ec++];75 ne>v = b;76 ne>next = vs[a].edges;77 vs[a ].edges = ne;

    78 }

    80 void dfs( int v) {81 TEdge e;

    83 ++csize;84 vs[v].v = 1;85 for (e = vs[v].edges; e; e = e>next)86 if (vs[e>v].v == 0)87 dfs(e>v);88 }

    Bi 1.5 (Tr chi) Hai ngi chi A v B chi mt trchi theo th t ln lt: Nhng s nguyn t1n Nkc hai s u v cui vit thnh mt dy v nhng ngichi xa cc s theo lut chi sau: Nu A n lt (khng

    ph thuc vo l ngi i th nt hoc th hai) th phichn mt s chn m n cha b xa, xa s ny v xathm tt c cc c s ca s chn (k c s 1). Khi Bn lt th phi xa s c chn l s l cha b xa vxa tt c cc c s ca s chn.

    Tr chi kt thc khi mt ngi chi n lt m khngthc hin c bc i, ngi cn li s thng.

    Hy vit mt chng trnh GAME.EXE, m cho ngichi A chng li trng ti l ngi B Chng trnh c thbt u chi ca ngi chi A i trc, cng nh ngichi A l lt i th hai.

    nh dng tp vo:

    D liu cho trng thi cuc chi chng trnh nhnbng tp thng qua cng vo chun. Tp vo cha snguyn dng N< 100 v sau cc dng ghi li du vtbng cc k t A, B hoc O (Ch ci hoa Ns lng), mi

    k t tng ng vi s nguyn th t ca dy1,2, 3,...,

    N.K t A ngha l s ti c xa bi ngi chi A tbc trc, cn k t B tng tng vi v tr cc s B xa, k t O ngha l s ti v tr cha b xa. S Nkhng thay i trong thi gian chi.

    nh dng tp ra: Chng trnh phi a ra cng chunu ra mt s nguyn, m n th hin s la chn cangi chi A n lt i.

    V d. Vi N = 9, nu ngi chi A c chi u

    tin, chng trnh c gi vi d liu u vo: 9OOOOOOOOO.

    V d. Nu A l ngi chi th hai, th kh nng d liu

    vo m c th nhn c t chng trnh sau bc th baca B l 9 BABAOOBAB, iu c th xy ra nu chngtrnh ca bn chi bc u tin chn s 2, cn bcth hai l s 8.

    Trong thi gian chng trnh chy c gi nhiu ln,khi mi ln nh vy nhn c d liu, th hin trng thibc i va qua ca B Chng trnh ca trong ti chilun lun ng v xc nh. Chng trnh ca ta lunlun nhn d liu u vo ng, th hin ng ln ltcc bc i. Khng cho chng trnh bn c hoc ghi vocc tp khc ngoi u vo v ra chun.

    Li gii 1.5. Khi ngi chi A thc hin bc i lxa mt s chn v sau xa tt c nhng c sca n, nhng c s ny c th l s chn v s l.Cn ngi chi B n lt th ch xa mt s l v ccc s ca n m ch c th l s l. Nh vy ngichi A c th gim s nhng v tr dnh cho ngichi B, cn ngc li th khng th.

    T ta d dng a ra chin lc cho cch chica ngi chi A. Ta xt tt c kh nng v tr ca tr

    chi (tt c nhng s chn cha xa) v ta m s sc chn v c s l ti mi v tr v chn s sao chohiu ca c s cha xa l v c s chn cha xallnnht-clivnhngsl.Tapdngchinthut ny n cui cuc chi.

    Chng trnh 5: game.c1 #include

    3 #define MAXN 128

    5 int n, ans;6 char s[MAXN];7 int a[MAXN];

    Nguyn Hu in 7/8 http://nhdien.wordpress.com

  • 8/3/2019 laptrinh-01-2012

    8/8

    LP TRNH = ++THUT TONS 1, 1 - 1 - 2012

    9 void readf(void);10 void solve(void);11 void writef (void);

    13 int main(void) {14 readf();15 solve();16 writef () ;

    18 return 0;19 }

    21 void readf(void) {22 scanf("%d%s", &n, s);23 }

    25 void solve(void) {26 int i , j , best, wb, cc;

    28 for (i = 1; i