passenger (+468)
Forumas
2005 metų olimpiados uždavinys
purexlt (+225)
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š 9 m
passenger (+468)
Dėkui, tikrai paprasčiau pasidarė spręsti, tik siaubingai atrodo :/
pakeista prieš 9 m
passenger (+468)
#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š 9 m
purexlt (+225)
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š 9 m
passenger (+468)
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 = 1kiek = 2*(8-1) = 14if (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]--;
}
}
purexlt (+225)
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 »
