OLIMPIADA MUNICIPALA DE INFORMATICA, IASI 2019
Problema PLANTA cu numărul 2908.
Ghita a primit de ziua lui o planta exotica, ce se comporta foarte ciudat. El a masurat-o cand a primit-o si a constatat ca are D cm, apoi a vazut ca se dezvolta intr-un ritm special:
In prima zi, planta creste cu A cm
In a doua zi, descreste cu B cm
In a treia zi, iar creste cu A cm
In a patra zi, descreste din nou cu B cm etc.
Pe scurt, in zilele cu numar de ordine impar creste cu A cm, iar in cele cu numar de ordine par, descreste cu B cm.
Cerinta
Știind D, inaltimea initiala a plantei si valorile A și B cu care aceasta creste, respectiv descreste, sa se afle ce inaltime va avea planta lui Ghita la finalul celei de-a N -a zile.
Date de intrare
Pe prima linie a fisierului planta.in se vor afla patru numere naturale D A B N in aceasta ordine, separate prin cate un spatiu, cu semnificatiile din enunt.
Date de ieșire
Pe prima linie a fisierului planta.out se va afla un numar H, semnificand inaltimea finala a plantei in cm la finalul celei de-a N -a zile.
Restrictii si precizari
0 ≤ D ≤ 100
1 ≤ B ≤ A ≤ 1 000 000
1 ≤ N ≤ 1 000 000 000
Pentru 50% dintre teste, 1 ≤ N ≤ 1 000 000
Se garanteaza ca pentru toate testele valorile se incadrează in tipul int.
Pentru rezolvarea acestei probleme va vom prezenta 3 algoritmi corecti de rezolvare, dar care dupa o analiza matematica a problemei pot fi imbunatatiti in mod considerabil.
Daca citim textul problemei, primul algoritm la care ne gandim in momentul in care vedem ca ni se cere ce inaltime are planta la finalul celei de a N-a zile este un algoritm in care folosim structura repetitiva cu un numar bine determinat de pasi, structura FOR.
Observam de asemenea ca in zilele cu numar de ordine impar planta creste cu A cm iar in zilele cu numar de ordine impar, inaltimea ei scade cu B cm.
Algoritmul s-ar putea scrie asa:
#include <fstream>
using namespace std;
ifstream cin(“planta.in”);
ofstream cout(“planta.out”);
int main() { int d, a, b, n, i;
cin >> d >> a >> b >> n; for (i = 1; i <= n;i++){ if (i % 2){d +=a;} else {d-= b;} } cout << d; cin.close(); cout.close(); return 0; }Daca trimitem insa aceasta solutie pe site vom primi doar 55 de puncte.
Erorile care ni se raporteaza si numarul scazut de puncte se datoreaza folosirii structurii FOR care pentru numere mari, 1 ≤ N ≤ 1 000 000 000 determina depasirea timpului de executie cerut de problema.
Ce concluzie tragem dupa acest rezultat modest? Trebuie sa eliminam aceasta bucla repetitiva in care am calculat inaltimea plantei noastre.
Revenim la specificitatea procesului de crestere / descrestere al plantei: in zilele cu numar de ordine impar planta creste cu A cm iar in zilele cu numar de ordine impar, inaltimea ei scade cu B cm.
Altfel spus, dupa 2 zile planta a crescut cu A-B, deoarece A>=B este specificat în problema.
In total, cresterea plantei va fi de (N/2) * (A-B) daca N este par deoarece vor fi N/2 grupe de cate 2 zile in care procesul are loc la fel.
Daca N este impar vom mai avea la final, in a N-a zi o crestere cu A cm deci inaltimea plantei se va modifica cu (n/2) * (A – B) + A.
Am evitat astfel bucla repetitiva si am scris urmatorul algoritm:
#include <fstream>
using namespace std;
ifstream cin(“planta.in”);
ofstream cout(“planta.out”);
int main() { int d, a, b, n; cin >> d >> a >> b >> n; if(n%2){ cout << d+(n/2)*(a-b)+a; }else{ cout << d+(n/2)*(a-b); }
cin.close(); cout.close(); return 0; }Daca trimitem spre evaluare automata acest cod, vom obtine 100 puncte.
Mai putem face o ultima observație: operatiile care trebuie facute pe cele doua ramuri ale stucturii if pot fi condensate intr-o singura operatie in care daca N este par trebuie sa mai adaugam un A la lungimea deja calculata a plantei dupa N-1 zile, adica la (N/2) * (A-B).
#include <fstream>
using namespace std;
ifstream cin(“planta.in”);
ofstream cout(“planta.out”);
int main() {
int d, a, b, n;
cin >> d >> a >> b >> n;
cout << d+(n/2)*(a-b)+a*(n%2);
cin.close();
cout.close();
return 0;
}
Am obținut o soluție tot de 100 de puncte, dar este o solutiei mai eficienta decat cele anterioare, fara decizii si fara repetitii.
Asteptam intrebarile si sugestiile voastre in legatura cu acest articol.
Mai multe articole gasiti pe blogul nostru https://academyitlan.wordpress.com
Va multumim ca ne urmariti!
Ergonomia se poate defini ca disciplina care se ocupă cu studiul condițiilor de muncă în vederea realizării unei adaptări optime a omului la acestea.
Afecţiuni provocate de un mediu de lucru inadecvat
Folosirea calculatorului necesitã realizarea unor miscãri stereotipe (miscãri dese ale gâtului,mainilor,spatelui etc.), ce pot duce la anumite afectiuni ale gâtului, umerilor, coloanei vertebrale etc. Aceste afectiuni se datoreazã miscãrilor repetate, concept ce se numeste RSI (Repetitive Strain Injury – Accidentare cauzatã de miscãri repetate).
Probleme de sãnãtate cauzate de lucrul cu calculatorul:
- Rãniri ale ochilor si slãbirea vederii;
- Obosealã;
- Probleme cu spatele;
- Dureri de umeri;
- Dureri de cap, etc.
Pentru o organizare eficientă şi fără urmări fizice asupra organismului nostru, a muncii cu calculatorul, trebuie ţinut cont de anumite norme de ergonomie:
Măsuri preventive în lucrul cu tastatura:
ajustaţi tastatura, astfel încât articulaţiile mâinilor să fie întotdeauna într-o poziţie neutră (intermediară), relaxate.
reglaţi poziţa tastaturii la o înălţime care să permită articulaţiilor să rămână drepte.
odihniţi-vă atunci când se încarcă un program sau când apare clepsidra pe monitor.
relaxaţi-vă mâinile, sprijinind antebraţele pe reazemele scaunului.
la fiecare 50 minute, faceţi exerciţii simple, pentru a reduce tensiunea muscularǎ, rotiţi umerii sau braţele, pentru a activa circulaţia sangvină şi masaţi-vă mâinile şi antebraţele.
Măsuri preventive privind gradul de iluminare:
asiguraţi-vǎ cǎ lumina cade indirect pe monitor;
poziţonaţi calculatorul astfel încât lumina de la fereastră să nu se reflecte din ecran în ochi (puteţi pune, dacă este nevoie, jaluzele sau draperii);
micşoraţi nivelul de iluminare (iluminarea cea mai bună este cea indirectă).
materialele scrise pe care le folosiţi în timpul lucrului la calculator este bine să le aşezaţi la acelaşi nivel cu monitorul;
Măsuri preventive privind lucrul cu monitorul:
· este recomandat ca monitorul să arate întotdeauna caracterele clar, fără distorsionǎri sau mişcǎri ale imaginii. Uneori, singura cale de a înlătura aceste inconveniente este cumpărarea unui nou monitor (monitoarele plate, de tip TFT, sunt mult mai recomandate pentru a vă proteja vederea). Se întâmplă ca monitorul să pâlpâie, uneori chiar insesizabil, lucru care se poate datora unei rate de reîmprospătare a imaginii (refresh rate) prea mici. Se recomandă utilizarea unei rate de reîmprospătare de minim 75Hz.
· ori de câte ori vă dor ochii, faceţi o pauză şi priviţi undeva în depărtare. Clipiţi des pentru a vi se umezi ochii. Pentru relaxare, închideţi ochii şi acoperiţi-i cu podul palmei. Odatǎ la 50 minute faceţi o pauzǎ indiferent dacǎ vǎ simţiţi sau nu obosiţi !!!
folosiţi substanţe antistatice pentru curăţarea monitoarelor, care nu atrag praful şi instalaţi un filtru pe ecran, pentru protecţia dumneavoastră.
faceţi un control oftalmologic periodic, pentru a vă asigura sănătatea ochilor.
aşezaţi-vă la o distanţă de cel puţin 40 de cm de ecranul monitorului.
închideţi monitorul când nu îl utilizaţi.
Măsuri preventive privind lucrul cu calculatorul:
· nu folosiţi calculatorul decât atunci când este necesar.
· asiguraţi-vă că biroul şi scaunul au înălţimea corectă – antebraţele şi coapsele trebuie să fie aşezate la orizontal.
· dacă masa este prea înaltă, atunci aşezaţi tastatura pe genunchi.
· poziţionaţi monitorul la nivelul ochilor sau puţin mai jos.
· ţineţi spatele drept, tălpile sprijinite în întregime pe podea sau pe un postament.
· ţineţi coatele apropiate de corp, astfel încât braţul să formeze un unghi de 90 de grade cu antebraţul, iar degetele uşor curbate pe tastatură astfel încât încheieturile mâinilor să nu fie înclinate sau sprijinite pe masă.
· nu loviţi tastele, ci atingeţi-le uşor, dupǎ care reveniţi în poziţia de aşteptare şi relaxaţi degetele.
· folosiţi ambele mâini pentru a efectua operaţii mai complexe (care presupun combinaţii din mai multe taste).
· încercaţi să staţi la o distanţă cât mai mare de monitor, dar să nu fiţi nevoiţi, din această cauză, să vă aplecaţi înainte pentru a vedea ce scrie pe ecran.