Autorius Tema: [Pamoka] Lietuvos mokinių informatikos olimpiada, miesto etapas 2012 sprendimai  (Skaityta 6740 kartus)

Neprisijungęs evolution

  • Naujokas
  • *
  • Įrašai: 101
  • Karma: +3/-0
    • Žiūrėti profilį
Šiandien vyko LMIO (Lietuvos mokinių informatikos olimpiada, miesto etapas). Čia norėčiau pateikti savo sprendimo būdą su paaiškinimais. Pridedu užduotį prie priedų.

I. Tikslas
Lavinti loginį mąstymą, sutiktų kliūčių įveikimą.

II. Teorija
Mūsų duomenų faile yra laikas - pradžia ir pabaiga, nuo kada Jaunėlis buvo užimtas. Mums reikia rasti visą Jaunėlio laisvo laiko sumą ir iš jos atimi filmukų trukmę tokia tvarka, jog peržiūrėtų skaičius būtų didžiausias.

III. Praktika
Pradėkime nuo pradžių. Pradiniai kintamieji: n, l masyvas - saugoti kiekvienai filmuko trukmės reikšmei, m. l masyvo reikšmių kiekį nustatome pagal n skaičių. Kadangi 1<=n<=100 maksimaliai gali būti 100 reikšmių įvesta į l masyvą. Taipogi įsivedame naują kintamąjį laikas laikyti viso laisvo laiko sumai. SUteikiame kintamajam laikas reikšmę =0, nes laisvo laiko iš pradžių neturime.
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
int n, l[100]={0},  m, laikas=0;
return 0;
}
tuomet nuskaitome n ir visas l reikšmes:
duom>>n;
    if(n>100 || n<0) // skirta patikrinti ar n priklauso nustatyti reikšmių sričiai
             return 0;
    for(i=0;i<n;i++)
    {
                   duom>>l[i];
                   if(l[i]>90 || l[i]<1) // skirta patikrinti ar l priklauso nustatyti reikšmių sričiai
                              return 0;
    }
dabar laikas skaityti m*2 reikšmių (pradžios ir pabaigos, kuomet buvo užimtas), bet viską saugoti į atmintį neapsimoka. Geriau randame skirtumą tarp darbo pradžios ir prieš jį buvusio darbo pabaigos. Tam atlikti:
duom>>m;
    if(m>50 || m<2) / tikriname, ar m priklauso nurodytam intervalui
            return 0;
    duom>>i; //pirmoji laiko pradžia mums yra nereikalinga, nes iš jos nieko neatiminėsime.
    if(i>1440 || i<0)
              return 0;
    for(i=0;i<m-1;i++)
    {
                    duom>>a[0]; //paprastas kintamasis laikyti reikšmei
                    duom>>a[1]; // paprastas kintamasis laikyti reikšmei
norėčiau atlikti pastebėjimą, kad po m reikšmės nusiskaitėme pirmąjį kintamąjį ir jo reikšmę pradanginome naudodami kintamąjį i cikle. Jis yra visiškai nereikalingas, nes mes iš naujo darbo pradžios atimame pabaigą. Kadangi pirmasis darbas yra laikomas miegu, prieš jį nėra atliekamas joks darbas, to pasekoje - nėra laisvo laiko prieš tai.
                    if(a[0]>1440 || a[0]<0)
                              return 0;
                    if(a[1]>1440 || a[1]<0)
                              return 0;
                    laikas+=a[1]-a[0]; // prie esamos laiko reikšmės pridedame a[1] ir a[0] skirtumą - laisvo laiko tarpą.
    }
    duom.close(); // duomenų failas mums nebereikalingas, tad jį uždarome
metas pagalvoti kaip gauti maksimalų peržiūrų skaičių. Iš ko mažesnio skaičiaus atiminėsime, tuo daugiau veiksmų galėsime atlikti (pastaba: laikas negali būti neigiamas, nes filmukai žiūrimi tik laisvu laiku). Todėl mums reikia savo l masyvą išrikiuoti didėjimo tvarka. Tam pasitelksime burbulo rikiavimo būdą.
for(i=0;i<n;i++)
    {
                    for(d=0;d<n;d++)
                    {
                                    if(l[i]<l[d])
                                    {
                                                 blaikas=l[i]; / blaikas, įsivestas kintamasis, skirtas laikyti besikeičiantiems duomenims.
                                                 l[i]=l[d];
                                                 l[d]=blaikas;
                                    }
                    }
    }
liko paskutinis etapas - išminusuoti filmukus iš viso laisvo laiko. Tam pasitelksime while ciklą.
i=0; // taupome kintamuosius, nes jie užima atmintį
    while(laikas>0 && i!=n) // kol laiko yra ir peržiūrėtų filmukų skaičius neviršija visų filmukų skaičiaus
    {
                   laikas-=l[i]; // išminusuojame l[i] reikšmę.
                   i++; // panaudojame i kintamąjį ne tik iš eilės imti l-ojo nariui, bet ir skaičiuoti kiek kartų buvo atimta filmukai
    }
spausdiname rezultatus. Ši vieta apgaulinga. Kadangi mes naudojome while ciklą - jis pirma tikrina reikšmę, po to atlieka veiksmus, mūsų laikas galėjo tapti neigiamas. Kadangi mes to nenorime, turime patikrinti laiko reikšmę - jei ji didesnė už 0 tuomet viskas tvarkoje, jei mažesnė - vadinasi while ciklas vienu kartu buvo atliktas per daug, todėl reikia atimti vieną kartą.
if(laikas>=0)
    cout<<i<<"\n";
    else
    cout<<i-1<<"\n";
    rez.close();
return 0;
}
IV. Apibendrinimas
Šis uždavinys nėra sudėtingas, reikia atkreipti dėmesį į tai, kad privaloma skaičius išrikiuoti didėjimo tvarka bei kaip susumuoti visą laisvą laiką.

Čia mano pirmasis programavimo tutorial'as tad jei kils neaiškumų, rašykit, badysiu atsakyti į jus klausimus ar atkreipti dėmesį į pastabas.
« Paskutinį kartą keitė: 2012-12-17 09:54:25 am sukūrė Lukas Liesis »

Neprisijungęs Lukas

  • Administratorius
  • Herojus
  • ******
  • Įrašai: 7431
  • Karma: +232/-15
    • Žiūrėti profilį
Ats: [Pamoka] Lietuvos mokinių informatikos olimpiada, miesto etapas 2012
« Atsakymas #1 Įrašytas: 2012-12-15 13:14:50 pm »
aciu, kad idejai, tik kita karta tema geriau pavadink taip, kad zmones galetu surasti sita informacija. "Pamoka filmukas" gali buti ir apie tai kaip kriaukle prisukt, ir apie tai kaip kasa geriau surist ir apie LMIO miesto etapa, todel geriau pavadinima rasyk tiksliau ;) si karta as jau pakoregavau.
Jūsų draugas, kolega ir puslapio administratorius,

Lukas.

Gerda Photography
Serveriai.lt 50% nuolaida!
Free Hosting
Free Templates

Neprisijungęs justinas

  • Naujokas
  • *
  • Įrašai: 164
  • Karma: +16/-3
    • Žiūrėti profilį
Ats: [Pamoka] Lietuvos mokinių informatikos olimpiada, miesto etapas 2012
« Atsakymas #2 Įrašytas: 2012-12-15 16:23:43 pm »
Mano abiejų užduočių sprendimai. Iš testų gavau maksimumą. https://gist.github.com/8c063a66114a534f8599

Prifarširuota begalės komentarų, kad įtikčiau vertintojams :D Nors neva C++, iš esmės parašyta gryna C – pakeiskite includus ir veiks ir su C kompiliatorium...
« Paskutinį kartą keitė: 2012-12-15 16:25:24 pm sukūrė justinas »

Neprisijungęs Lukas

  • Administratorius
  • Herojus
  • ******
  • Įrašai: 7431
  • Karma: +232/-15
    • Žiūrėti profilį
Ats: [Pamoka] Lietuvos mokinių informatikos olimpiada, miesto etapas 2012
« Atsakymas #3 Įrašytas: 2012-12-15 16:26:37 pm »
Mano abiejų užduočių sprendimai. Iš testų gavau maksimumą. https://gist.github.com/8c063a66114a534f8599

Prifarširuota begalės komentarų, kad įtikčiau vertintojams :D Nors neva C++, iš esmės parašyta gryna C – pakeiskite includus ir veiks ir su C kompiliatorium...
sveikinu :) ir aciu, kad daliniesi. Gal turi dar ir  uzduoties aprasyma?
Jūsų draugas, kolega ir puslapio administratorius,

Lukas.

Gerda Photography
Serveriai.lt 50% nuolaida!
Free Hosting
Free Templates

Manualai.lt Forumas

Ats: [Pamoka] Lietuvos mokinių informatikos olimpiada, miesto etapas 2012
« Atsakymas #3 Įrašytas: 2012-12-15 16:26:37 pm »

Neprisijungęs justinas

  • Naujokas
  • *
  • Įrašai: 164
  • Karma: +16/-3
    • Žiūrėti profilį
Ats: [Pamoka] Lietuvos mokinių informatikos olimpiada, miesto etapas 2012
« Atsakymas #4 Įrašytas: 2012-12-15 16:32:59 pm »
sveikinu :) ir aciu, kad daliniesi. Gal turi dar ir  uzduoties aprasyma?

http://olimp.mif.vu.lt turėtų tebeeiti prisiregistruoti viršuje pasirinkus II etapas (X-XII klasės), ten yra užduotys. :)

Neprisijungęs Lukas

  • Administratorius
  • Herojus
  • ******
  • Įrašai: 7431
  • Karma: +232/-15
    • Žiūrėti profilį
Ats: [Pamoka] Lietuvos mokinių informatikos olimpiada, miesto etapas 2012
« Atsakymas #5 Įrašytas: 2012-12-16 13:27:06 pm »
aš iš paskutinės ne visus taškus gavau...
Antra užduotis:
http://olimp.mif.vu.lt/file-download?taskFileId=1726
http://olimp.mif.vu.lt/file-download?taskFileId=1727

neina prieiti: "Jums čia draudžiama."
Jūsų draugas, kolega ir puslapio administratorius,

Lukas.

Gerda Photography
Serveriai.lt 50% nuolaida!
Free Hosting
Free Templates

Neprisijungęs evolution

  • Naujokas
  • *
  • Įrašai: 101
  • Karma: +3/-0
    • Žiūrėti profilį
Ats: [Pamoka] Lietuvos mokinių informatikos olimpiada, miesto etapas 2012
« Atsakymas #6 Įrašytas: 2012-12-16 15:41:22 pm »
Antras praktinis uždavinys.

Manualai.lt Forumas

Ats: [Pamoka] Lietuvos mokinių informatikos olimpiada, miesto etapas 2012
« Atsakymas #6 Įrašytas: 2012-12-16 15:41:22 pm »