Jump to content
php.lv forumi

programmēšanas olimpiāde


laucinieks

Recommended Posts

or un hardkodētu ciparu tur mazliet pa daudz. ar tādu pieeju var atrisināt 1 zvaigžnu uzdevumus, bet netiksi nekur uz priekšu ar vairāku zvaigžņu uzdevumiem.

varbūt uzreiz jau patrenējies un padomā kā varētu īsāk, ja zini cik dienu ir katrā mēnesī 2001 gadā.

Link to comment
Share on other sites

  • Replies 55
  • Created
  • Last Reply

Top Posters In This Topic

Uzdevumam diena, var darīt pavisam vienkārši.

ieraksti masīvā visu dienu skaitu mēnešo un ielasi dienas numur d.

Tālāk ej, kamēr diena ir lielāka par tekošo mēnesi, kur katrā solī atņem no kopēja dien skaita mēnešu dienu skaitu un palielini mēnesi.

Beigās izvadi atlikušo dienu skaitu un mēnesi. Mēnesim pieskaita 1, jo masīvs sākas no 0, kamēr pirmais mēnesis ir 1.

http://paste.php.lv/...d71c6d?lang=cpp

 

Otrs uzdevums principā pareizs, tikai abstrahēšana nepareiza. Izvadi failā, noteikti nevajag likt kopā funkcijā ar pašu aprēķinu, jo tās pilnīgi nesaistītas lietas. Ja gribētu abstrahēt, tev būtu jāveido funkcija, kas tikai veic datu konversiju. Taču praktiski, ja darbība netiek veikta vairākas reizes un ir tik īsa, funkciju saitīt atsevišķi nav nepieciešams. Un pilnībā pietiktu ar:

cin >> n1 >> n2 >> n3;
pensi = n3 + (n2 * 12) + (n1 * 20 * 12);
cout << pensi / 100 << " " << pensi % 100;

Edited by codez
Link to comment
Share on other sites

Sveiki,

Tātad tagad mēģinu atrisināt "Skaitļi 2".

Kods ir - http://paste.php.lv/d06615fb928bb285bf803a021c3b7e82?lang=cpp

Doma ir pārvērst visus int uz string un tad pārbaudīt ar find_first_of funkciju, jo uz int, šī funkcija man nestrādaja, bet nu palaižot programmu izmetas errors.

Uzdevums - http://www.lio.lv/olimps/uzdevumi.php?show=35

Laucinieks.

Link to comment
Share on other sites

1) Tak pamekeklē googlē kā c++ pārvērš int par string. Lūk, piem., man google izmeta stack tieši tādu jautājumu ar neskaitāmiem veidiem atbilžu: http://stackoverflow...ger-to-string-c

2) Tev nevajag tur string. Uztaisi funkciju, kura pārbauda vai cipars ir skaitlī, ņemot ciklā, dalot ar 10 un skatoties atlikumu dalot ar 10. Respektīvi atlikums dalot ar 10 ir pēdējais cipars, bet dalīšana ar 10 nogriež pēdējo ciparu. to dari līdz pārbaudāmais ir 0.

bool isdigit(int n, int c){

//...

}

Edited by codez
Link to comment
Share on other sites

  • 2 months later...

Sveiki,

Tā kā programmēšanas olimpiāde, vairs nav aiz kalniem, un esmu cītīgi gatavojies, ir radies iespējams viens no pēdējiem jautājiem. Nolikumā - http://vip.latnet.lv/lio/DOKI/Inform%C4%81tikas_nolikums_2011_mo.pdf 5.2.1 d) punktā ir rakstīts, ka drīkst izmantot programmēšanas valodu dokumentāciju. Tā dokumentācija ir noderīga, un cik plaša viņa ir? Praktiski, ja tu aizmirsti, kā kaut ko uzrakstīt, vai kādu funkciju, vai tu viņā vari atrast visu?

Ar cieņu,

Laucinieks

Link to comment
Share on other sites

  • 3 weeks later...

Sveiki,

 

Tā kā otrdien jau ir olimpiāde, tad pēdējais jaut. - par cik ir atļauts ņemt līdzi savus datorus, doma ir ņemt līdzi un izmantot Codeblocks, jo esmu jau ļoti pieradis pie tā. Bet cik atradu, tad tur var izvēlēties GNU C++ 3.4.2 ; Microsoft Visual C++ 2008 un GNU C++ 4.1.1 kompilatorus testēšanai.

Tātad jautājumi - vai varēs izmantot Codeblocks - rakstīšanai?

Ja varēs, kuru no compilatoriem, vislabak izmantot pie globālās testēšanas?

 

AC,

L.

Link to comment
Share on other sites

Sveiki,

 

Tātad par šī paša gada uzdevumiem, 18:00 zināšu visus rezultātus.

Ir daži jautājumi -

Uzdevumi - http://lio.e-spiets.lv/2012/Rajons2012_vec.pdf

1) No cik punktiem parasti tiek uz valsti?

Bija 2 lietas, kas sagādāja problēmas atrisināt uzdevumus -

2) Otrajā uzdevumā, uztaisīju tikai, lai pārbauda visus skaitļu summu no sākuma līdz beigām, šeit punkti būs vismazāk, jo atkal radīja problēmu - pārbīdīšanās par ciklu, ceru ka sapratāt, ko domāju.

3) Trešajā uzdevumā it kā viss būtu skaidrs, bet nesaprotu 1. piemēru, kā viņi tur dabū 5, jo man praktiski sanāk 6 tur. It kā pārējiem testa uzdevumiem viss bija pareizi.

Varbūt variet, kāds, iemest arī kā Jūs tos uzdevumus risinātu? Savējiem risinājumiem vairs netieku klāt, tāpēc nevarēšu iemest.

Ar cieņu,

L.

Link to comment
Share on other sites

1. uzdevums.

Zobratiem pa vidu nav nozīmes, svarīgi tikai tikai sākuma un beigu. tātad beigu zobrats pagriezās par K * m[0]/m[n-1] reizēm. Tā kā atbilde bija jādod kā daļskaitlis, tad izrēķinam veselo daļu un atlikušajai izrēķinām LKD, ar kuru izdala saucēju un skaitītāju, lai noīsinātu daļu.

Jālieto bija long long mainīgie, jo bija reizinājums 10^9*10^9, kas int tipa mainīgajā nesaiet.

 

sarežģītība: O(1)

 

2.uzdevums.

ejam no pirmās pēc kārtas un ņemam katru kartiņu. Pie katras kartiņas skaitam līdzi, cik tajā vietā no sākuma ir starpība starp zilajām un sarkanajām kartiņām, 0, -1, +1, -2, +2, utt., un skaitam summu no sākuma. Tad pie katrā pozīcijā, glabājam tādai starbībai minimālo summu un maksimālo labāko vērtību, kas ir starpība starp pašreizējo summu un pirms tam bijušo mazāko summu pie tādas zilo un sarkano kartiņu kartiņu starpības.

 

1,-2,2,-2,5,10,3,3,3,-7,8

 

tātād atbilstošais zilo un sarkano starpību skaits un summa no sākuma līdz attiecīgajai vietai:

 

1 0 -1 0 1 0 1 0 1 0

1 -1 1 -1 4 14 17 21 14 22

 

šos datus var rēķināt ejot cauri un masīvā glabājot tikai zilo un sarkano starpībai atbilstošo minimālo summu. pēc šī var redzēt, ka maksmālā starpība veidojas pe kartiņu starpības 0 un ir 22 - (-1) = 23.

 

sarežģītība: O(N)

 

3.uzdevums

Šeit jāizveido koka struktūra, kuru ērti varētu uztaisīt, glabājot katrai pilsētai masīvā šadu struktūru:

struct town{
 int maxtime;

 int postmen;
 int shipments;
 list<int> childs;
};

 

tālāk ar rekursiju ejam cauri uz skatamies, kāds ir maksimālais laiks, ko patērēja kādā no bērna atzariem un kāds, kurus uzzinam ar rekursijas funkciju un saskaitām kāds ir kopējais pastnieku skaits.

 

sarežģītība: O(N)

Edited by codez
Link to comment
Share on other sites

Skaidrs,

 

Tagad būs jāmēģina tie vēlreiz atrisināt, un jāmēģina atrast labāks risinājums. Par pirmo uzdevumu, tur bija problēmas ar tām daļām, jo praktiski tās daļas es diezgan sarežģīti aprēķināju, un man sanāca, ka testa uzdevumos ir pareiza atbilde, bet pārējos testos 20% laiks pārsniedz max. laiku (0.21/0.2 0.206/0.2 u.t.t.) un 20% ir tādu kuriem ir nepareizs rezultāts (ar daļām).

 

Pēdējais uzdevums liekas vispār nav ieskaitīs, jo testa pirmais piemērs nebija izpildīts (ar to 5).

 

Otrajā uzdevumā 10% pareizi, kopā pašlaik 58 punkti. Godīgi sakot esmu vīlies sevī, un tagad gatavošos daudz cītīgāk nākošajam gadam ;).

 

AC,

L.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...