Pereiti prie turinio

Lietuvos Mokinių informatikos olimpiada


Rekomenduojami pranešimai

web'as: http://www.lmio.mii.vu.lt/

 

2 etapo rezultatų (be teorinio) PDF: http://www.lmio.mii.vu.lt/?act=getFile&id=1212

aciu, bet cia dar ne galutiniai.

76/80 pas mane testuose, kazkodel vienas variantas neveike ten, nors pas mane pati viskas veike taip kaip ir turejo. nu nieko, tikiuosi ir mano mokytojas nepatinges greitai atsiust galutiniu :D

 

o jau komentarai tame website :D sadddddd

Redagavo Lomboro
Nuoroda į pranešimą
Dalintis kituose puslapiuose
  • po 2 savaičių...

#include <fstream>
#include <string>
using namespace std;

const char Dfailas[] = "sifras-vyr.in";
const char Rfailas[] = "sifras-vyr.out";
const int  MaxZ      = 10;

void Skaitymas(string& sifras, int& n, string Zodziai[]);
void Iesko(string sifras, int n, string Zodziai[]);
void Rikiuoti(string& zodis);

int main(void) {
   int n;
   string sifras;
   string Zodziai[MaxZ];

   Skaitymas(sifras, n, Zodziai);
   Iesko(sifras, n, Zodziai);

   return 0;
}

void Skaitymas(string& sifras, int& n, string Zodziai[]) {
   ifstream fd(Dfailas);
       fd >> sifras;
       fd >> n;
       for (int i = 0; i < n; i++)
           fd >> Zodziai[i];
   fd.close();
}

void Iesko(string sifras, int n, string Zodziai[]) {
   string spejimas;
   ofstream fr(Rfailas);
   // Jeigu šifras sudarytas iš keturiu žodžių
   if (n >= 4) {
       for (int i = 0; i < n; i++)
           for (int j = i; j < n; j++)
               for (int k = j; k < n; k++)
                   for (int l = k; l < n; l++) {
                       spejimas = Zodziai[i] + Zodziai[j] + Zodziai[k] + Zodziai[l];
                       Rikiuoti(spejimas);
                       if (spejimas == sifras)
                           fr << i+1 << " " << j+1 << " " << k+1 << " " << l+1 << endl;
                   }
   }
   // Jeigu šifras sudarytas iš trijų žodžių
   if (n >= 3) {
       for (int i = 0; i < n; i++)
           for (int j = i; j < n; j++)
               for (int k = j; k < n; k++) {
                   spejimas = Zodziai[i] + Zodziai[j] + Zodziai[k];
                   Rikiuoti(spejimas);
                   if (spejimas == sifras)
                       fr << i+1 << " " << j+1 << " " << k+1 << endl;
               }
   }
   // Jeigu šifras sudarytas iš dviejų žodžių
   if (n >= 2) {
       for (int i = 0; i < n; i++)
           for (int j = i; j < n; j++) {
                   spejimas = Zodziai[i] + Zodziai[j];
                   Rikiuoti(spejimas);
                   if (spejimas == sifras)
                       fr << i+1 << " " << j+1 << endl;
               }
   }
   // Jeigu šifras sudarytas iš vienintelio žodžio
   for (int i = 0; i < n; i++) {
       spejimas = Zodziai[i];
       Rikiuoti(spejimas);
       if (spejimas == sifras)
           fr << i+1 << " " << endl;
   }
   fr.close();
}

void Rikiuoti(string& zodis) {
   char temp;
   for (int i = 0; i < zodis.length()-1; i++)
       for (int j = i+1; j < zodis.length(); j++)
           if (zodis[j] < zodis[i]) {
               temp = zodis[i];
               zodis[i] = zodis[j];
               zodis[j] = temp;
           }
}

 

Algoritmas sugalvotas Lomboro

Nuoroda į pranešimą
Dalintis kituose puslapiuose
  • po 2 savaičių...

Kadangi pirmą kartą dalyvavau, tai nieko lengvesnio ir nesitikėjau. Rezultato taip pat nesitikėjau gero, tad 180t. skaitau tikrai neblogai :)

kelintokas?

dabar kazkaip padare,kad rodytu visus testus ir pan.

Uzduotys buvo sunkios,krc galejo padaryt,kad nerodytu testu.

Nes testai buvo sunkus,10 devintuoju ir pan.Kas mokejo algoritmo sudetinguma,tam ir be problemu buvo.

Redagavo geras1
Nuoroda į pranešimą
Dalintis kituose puslapiuose

137. Kelio radimo, prisipažįstu, paprasčiausiai nemoku, tai padariau bukai – jei katinas sukasi į kairę, kodėl gi Linui nesisukus tik į dešinę :lol:

 

Milžinas buvo lengvas, bet nespėjau perrašyti efektyvesniu algoritmu (spėdavo suskaičiuoti tik testuose, už kuriuos duodami 75 taškai). Oro uostą padariau pusiau – irgi ne visad geriausiai sudėliodavo lėktuvus :)

Redagavo Silke
Nuoroda į pranešimą
Dalintis kituose puslapiuose

kelintokas?

dabar kazkaip padare,kad rodytu visus testus ir pan.

Uzduotys buvo sunkios,krc galejo padaryt,kad nerodytu testu.

Nes testai buvo sunkus,10 devintuoju ir pan.Kas mokejo algoritmo sudetinguma,tam ir be problemu buvo.

 

Respublikiniam etape bus naudojama kita varžybų testavimo sistema https://github.com/cms-dev/cms tenai kaip ir BOI, IOI olimpiadoj nesimatys pačių testų tačiau žinosi kiek testų praėjo, senoji sistema buvo naudojama paskutinį kartą ir ant jos tokios galimybės nėra.

Pats esu dvyliktokas, surinkau 300. Pirmi du pasirodė labai lengvi (milžinas ir katinas), su trečiuoju dėl durnos rikiavimo klaidos (ne pagal tą surikiavau ir nepastebėjau, kad taip nutiko) labai ilgai knisaus prie dinaminio oro uosto sprendimo. Kiek teko šnekėtis su draugais, tai rodos 6 žmonės surinko maximumą.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Oro uostas:

#include <iostream>
#include <cstdio>
#include <algorithm>
#define MAXN 100005

using namespace std;

struct Lektuvas {
   int v, t;

   bool operator < (const Lektuvas &l) const {
       return v < l.v;
   }
} lektuvas[MAXN];

int n, a[MAXN], l[MAXN];

int main () {
   freopen("orouostas-vyr.in", "r", stdin);
   freopen("orouostas-vyr.out", "w", stdout);

   cin >> n;

   for(int i = 0; i < n; ++i)
       cin >> lektuvas[i].t >> lektuvas[i].v;

   sort(lektuvas, lektuvas + n);

   for(int i = 0; i < n; ++i) {
       for(int j = 0; j + lektuvas[i].t <= lektuvas[i].v; ++j)
           a[j + lektuvas[i].t] = max(a[j + lektuvas[i].t], l[j] + 1);

       copy(a, a+lektuvas[i].v + 1, l);
   }

   cout << *max_element(a, a + MAXN) << '\n';
}

 

Milzinas:

#include <iostream>
#include <cstdio>
#define MAXN 1000005

using namespace std;

int n, p;
string s;
bool kal[MAXN];

void lava(int x, char p){
   if(x < 0 || x >= n || kal[x] || s[x] != p)
       return;

   kal[x] = true;

   if(p == 'D')
       lava(x-1, p);
   else if(p == 'K')
       lava(x+1, p);

}

int main () {
   freopen("milzinas-vyr.in", "r", stdin);
   freopen("milzinas-vyr.out", "w", stdout);

   cin >> n >> p >> s;

   for(int i = 0; i < n; ++i)
       if(s[i] == 'L'){
           kal[i] = true;

           lava(i-1, 'D');
           lava(i+1, 'K');
       }

   int answer = 0;

   for(int i = 0; i < p; ++i){
       int x;
       cin >> x;

       if(!kal[x-1])
           ++answer;
   }

   cout << answer << endl;
}

 

 

Katinas:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <queue>
#define MAXN 3005

using namespace std;

const int dy[] = {0, 1, 0, -1}, dx[] = {-1, 0, 1, 0};
int v[MAXN][MAXN];

int d, t, n, m, sy, sx, catPy, catPx;

string l[MAXN];

inline bool isValid(int y, int x) {
   return (y >= 0 && y < n && x >= 0 && x < m && l[y][x] != '#');
}

int katinoKelias() {
   int catKr = 0, moves = 0;

   int cy = sy, cx = sx;

   while(l[cy][cx] != 'P') {
       if(!isValid(cy + dy[catKr], cx + dx[catKr])) {
           catKr = (catKr + 1) % 4;
       } else {
           cy += dy[catKr];
           cx += dx[catKr];

           ++moves;
       }
   }

   catPy = cy;
   catPx = cx;

   return moves;
}


void linoKelias() {
   for(int i = 0; i < MAXN; ++i)
       for(int j  = 0; j < MAXN; ++j)
           v[i][j] = -1;

   queue<int> q;

   v[sy][sx] = 0;

   q.push(sy);
   q.push(sx);

   while(!q.empty()) {
       int cy = q.front();
       q.pop();
       int cx = q.front();
       q.pop();

       for(int i = 0; i < 4; ++i) {
           int y = cy + dy[i];
           int x = cx + dx[i];

           if(isValid(y, x) && v[y][x] == -1) {
               q.push(y);
               q.push(x);
               v[y][x] = v[cy][cx] + 1;
           }
       }
   }
}


int main () {
   freopen("katinas-vyr.in", "r", stdin);
   freopen("katinas-vyr.out", "w", stdout);

   cin >> d >> t >> n >> m;


   for(int i = 0; i < n; ++i)
       cin >> l[i];

   for(int i = 0; i < n; ++i)
       for(int j = 0; j < m; ++j)
           if(l[i][j] == 'S') {
               sy = i;
               sx = j;
           }

   int lKatinas = katinoKelias();
   linoKelias();

   int lLino = v[catPy][catPx] + t;

   if(lLino <= lKatinas)
       cout << d << endl;
   else
       cout << max(0, d - (lLino - lKatinas)) << endl;
}

Redagavo internautas
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Devintokas aš, surinkau 285/300 taškų :). "Megztiniai" ir "Laiptai" buvo labai lengvi, prie "Komfortas" sėdėjau ilgai. Būtų įdomu pažiūrėt kieno nors sprendimą veikiantį pilnai to "Komfortas".

 

Manau paprasčiausia spręsti Komfortą būtų su dinaminiu programavimu arba kadangi yra tik du žmonės pasirašius funkciją kuri patikrintų du persėdimo atvejus ir gražintų mažesnį atsakymą. Žemiau mano sprendimas su dinaminiu programavimu, norint jį galima pagražint, bet tingėjau:

#include <iostream>
#include <cstdio>
#define MAXN 1000006
#define INF 9988555

using namespace std;

int n, a[MAXN][2], b[MAXN][2];

bool isValid(int index) {
   return ((a[index][0] & a[index-1][0]) == 0 && (a[index][1] & a[index-1][1]) == 0);
}

int compute() {
   int moves = 0;
   b[0][0] = b[0][1] = 0;

   for(int i = 1; i <= n; ++i) {

       if(isValid(i))
           b[i][0] = min(b[i][0], b[i-1][0]);

       swap(a[i-1][0], a[i-1][1]);

       if(isValid(i))
           b[i][0] = min(b[i][0], b[i-1][1]);

       swap(a[i][0], a[i][1]);

       if(isValid(i))
           b[i][1] = min(b[i][1], b[i-1][1] + 1);

       swap(a[i-1][0], a[i-1][1]);

       if(isValid(i))
           b[i][1] = min(b[i][1], b[i-1][0] + 1);

       swap(a[i][0], a[i][1]);

   }

   return min(b[n][0], b[n][1]);
}

int main() {
   freopen("komfortas-jau.in", "r", stdin);
   freopen("komfortas-jau.out", "w", stdout);

   cin >> n;

   fill(&b[0][0], &b[MAXN-1][1], INF);

   for(int i = 1; i <= n; ++i)
       cin >> a[i][0] >> a[i][1];

   int answer = compute();

   if(answer == INF)
       cout << -1 << endl;
   else
       cout << answer << endl;
}

Nuoroda į pranešimą
Dalintis kituose puslapiuose
  • po 3 savaičių...

Gal kas galite pasidalinti savo sprendimą megztiniai, su pascal?

Tu devintokas? C++ kodo nebeturiu, bet padaręs buvau taip: nuskaito talpą, megztinius į masyvą, ir yra skalbimų kiekio kintamasis. Paskui su ciklu:

for(int i = 0; i < megztiniuSpalvu; i++)
{
   liekana = megztiniai[i] % talpa;
   skalbimuKiekis += megztiniai[i] / talpa;
   if(liekana != 0)
       skalbimuKiekis++;
}

 

Beje, patekau į tą antrą etapą :).

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tu devintokas? C++ kodo nebeturiu, bet padaręs buvau taip: nuskaito talpą, megztinius į masyvą, ir yra skalbimų kiekio kintamasis. Paskui su ciklu:

for(int i = 0; i < megztiniuSpalvu; i++)
{
   liekana = megztiniai[i] % talpa;
   skalbimuKiekis += megztiniai[i] / talpa;
   if(liekana != 0)
       skalbimuKiekis++;
}

 

Beje, patekau į tą antrą etapą :).

arba :

   fd >> N >> H;
   for(int i = 1; i <= N; i++)
   {
   fd >> temp;
   while(temp > 0)
   {
   temp -= H;
   k++;
      }
 }

285 taskus surinkes,100 proc patenki :) sveikinu

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

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

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

  • Prisijunk prie bendruomenės dabar!

    Uždarbis.lt nariai domisi verslo, IT ir asmeninio tobulėjimo temomis, kartu sprendžia problemas, dalinasi žiniomis ir idėjomis, sutinka būsimus verslo partnerius ir dalyvauja gyvuose susitikimuose.

    Užsiregistruok dabar ir galėsi:

    ✔️ Dalyvauti diskusijose;

    ✔️ Kurti naujas temas;

    ✔️ Rašyti atsakymus;

    ✔️ Vertinti kitų žmonių pranešimus;

    ✔️ Susisiekti su bet kuriuo nariu asmeniškai;

    ✔️ Naudotis tamsia dizaino versija;

    ir dar daugiau.

    Registracija trunka ~30 sek. ir yra visiškai nemokama.

  • Naujausios temos

  • Karštos temos

×
×
  • Pasirinkite naujai kuriamo turinio tipą...