eMatematikas Prisijunk Forumas Egzaminų užduotys ONLINE testai

2005 metų olimpiados uždavinys


http://www.part.lt/img/ae4aba67e078667acda07edd93598f40383.png

pakeista prieš 7 m

Na, o toliau į juodraštį gali pasipaišyti kaip dalybos procesas vyksta, labai aiški sąlyga ;) Primena 2015 metų VBE su dalybomis, tik čia keli papildomi kriterijai yra

pakeista prieš 7 m

Dėkui, tikrai paprasčiau pasidarė spręsti, tik siaubingai atrodo :/

pakeista prieš 7 m


#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;
const char CDfv[] = "Duomenys.txt";
const char CRfv[] = "Rezultatai,txt";
//--------------------------------------------------------------------------
void Skaityti(const char fv[], int & n, int Akmenukai[]);
void Spausdinti(const char fv[], int & n, int Akmenukai[]);
void Atrinkti(int & n, int Akmenukai[]);
//--------------------------------------------------------------------------
int main() {
    int n;                                 
    int Akmenukai[10];                   

    Skaityti(CDfv, n, Akmenukai);
    Atrinkti(n, Akmenukai);
    Spausdinti(CRfv, n, Akmenukai);

}
void Skaityti(const char fv[], int & n, int Akmenukai[])
{
    ifstream fd(fv);                       
    fd >> n;                               
    for(int i = 1; i <= n; i++)
        fd >> Akmenukai[i];               
    fd.close();                           
}
void Spausdinti(const char fv[], int & n, int Akmenukai[])
{
    ofstream fr(fv);                       
    for(int i = 1; i <= n; i++)
        fr << Akmenukai[i] << " ";
    fr.close();                           
}
void Atrinkti(int & n, int Akmenukai[])
{
    int ind;
    for(int i = 1; i <= n-1; i++) {
        if (Akmenukai[i] != 0){
            ind = i;
            int kiek = 2*(n-i);
            while (Akmenukai[i] != 0 && kiek != 0) {
                if (ind >= n) {
                    while (ind != i && Akmenukai[i] != 0) {
                        kiek--;
                        Akmenukai[ind]++;
                        Akmenukai[i]--;
                        ind--;
                    }
                }
                else if (ind < n ) {
                    while (ind != n && Akmenukai[i] != 0) {
                        kiek--;
                        ind++;
                        Akmenukai[ind]++;
                        Akmenukai[i]--;
                    }
                }
            }
        }
    }

}

pakeista prieš 7 m

Man tavojo kodo nesukompiliuoja, meta, kad core dumped. Pora pastebėjimų:
int kiek = 2*(n-i); // Nelabai suprantu kam jis naudingas / kokia jo paskirtis..
if (ind >= n) { // neįgyvendinama sąlyga, nes vaiko indeksas ind niekada nebus didesnis arba lygus n
Paskutinis dalijimo procesas gerai pas tave aprašytas.

Maniškis sprendimas
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    ifstream fd("vaikai.txt");
    int n, vaikai[10]; // vaiku skaicius; vaiku masyvas

    // Nuskaitomi duomenys
    fd >> n;
    for(int i = 0; i<n; i++)
        fd >> vaikai[i];
    fd.close();

    // Vykdomas dalijimo procesas
    int a = 0; // kintamasis vaiku stovejimo indeksui zymeti
    for(int i = 0; i<n-1; i++){ // ejimas per vaikus iki (n-1)-ojo, nes jis nedalija
        a = i+1;
        while(vaikai[i]>0 && a<n){ // vaikas eina i prieki
            vaikai[i]--;
            vaikai[a]++;
            a++;
        }
        while(vaikai[i]>0 && a>i){ // vaikas eina atgal link savo vietos
            vaikai[i]--;
            a--;
            vaikai[a]++;
        }
    }

    // Rezultatu isvedimas
    ofstream fr("Rezultatai.txt");
    for(int i = 0; i<n; i++)
        fr << vaikai[i] << " ";
    fr.close();
    return 0;
}


Pavyzdinė įvestis:
8
10 5 5 12 10 1 1 1

Išvestis:
0 0 0 7 9 5 10 14

pakeista prieš 7 m

Dėkui už pastabas ir sprendimą :)

int kiek = 2*(n-i);        // maksimalus akmenukų skaičius, kuris galimai bus atiduotas kitiems vaikams
n - vaikų skaičius
i(kintamas) - vaiko numeris eilėje

pvz: kai n = 8, o i = 1
kiek = 2*(8-1) = 14

if (ind >= n) {            // ši sąlyga bus įgyvendinama, nes ind nėra vaiko eilės numeris - i, o tik šio kintamojo kopija. ind skirta, kad i reikšmė nekistu


                else if (ind < n ) {
                    while (ind != n && Akmenukai[i] != 0) {
                        kiek--;
                        ind++;              // <-- čia
                        Akmenukai[ind]++;
                        Akmenukai[i]--;
                    }
                }

    int ind;
    for(int i = 1; i <= n-1; i++) {
        if (Akmenukai[i] != 0){
            ind = i;
            int kiek = 2*(n-i);
            while (Akmenukai[i] != 0 && kiek != 0) {
                if (ind >= n) {
                    ...
                }
            ...

Kaip i, taip ir ind priklauso intervalui [tex] [1;n-1],  n\in N[/tex], todėl nebus įvykdytas paskutinis sąlygos sakinys while cikle. Siūlyčiau komentuoti programos eilutes, bus ne tik pačiam patogiau, bet ir per IT egzaminą gausi kelis papildomus taškus..

Nori sudalyvauti šioje temoje ir parašyti savo pranešimą? Prisijungti »