Rezolvare completă PbInfo #1470 Parcare

În parcările din Iași, intrarea în parcare este permisă dacă șoferul care dorește să parcheze solicită acest lucru.

Solicitarea se face prin apăsarea unui buton la automatul aflat la intrarea în parcare, acțiune care are ca efect eliberarea unui tichet de parcare și deschiderea barierei. Pe tichet sunt trecute data și ora intrării în parcare.

La plecare, șoferul scanează tichetul la automatul de plată. În urma scanării automatul calculează şi afișează suma de plată. Calculul sumei se face astfel:

  • se citește de la ceasul automatului data și ora plecării
  • se calculează diferența de timp dintre ora plecării și ora intrării în parcare
  • diferența calculată se rotunjește la număr întreg de ore, în sus
  • se înmulțește timpul exprimat în ore cu tariful orar

Cerința

Cunoscându-se data și ora intrării în parcare, data și ora plecării din parcare și tariful orar, să se determine timpul cât a stat mașina în parcare și suma de plată.

Date de intrare

Fişierul de intrare parcare.in conţine pe prima linie data și ora intrării în parcare, separate printr-un spațiu, sub forma zz ll hh mm.

Pe linia a doua a fişierului de intrare se găsesc data și ora plecării din parcare, separate printr-un spațiu, sub forma zz ll hh mm.

Linia a treia conţine un număr natural t reprezentând tariful orar exprimat în lei.

Pe linia a patra a fișierului de intrare se găsește una dintre valorile 1 sau 2 reprezentând cerinţa: 1, dacă se cere determinarea timpului cât a stat mașina în parcare, timp exprimat în minute, respectiv 2, dacă se cere determinarea sumei de plată pentru parcare.

Date de ieșire

Fişierul de ieşire parcare.out conţine pe prima linie o valoarea naturală reprezentând timpul cât mașina a stat în parcare, exprimat în minute, dacă cerinţa a fost 1, respectiv suma de plată, dacă cerinţa a fost 2.

Restricții și precizări

  • Mașina stă în parcare cel puţin 1 minut dar nu poate sta mai mult de 7 zile.
  • Dacă timpul de staţionare nu depăşeşte 15 minute, nu se percepe taxă.
  • Cele două date sunt din același an, care nu este bisect.
  • Minutul de plecare din parcare nu se contorizează.
  • Minutele unei ore sunt numerotate de la 0 la 59.
  • 1 <= t <= 100
  • Pentru cerinţa 1 se acordă 50% din punctaj, iar pentru cerinţa 2 se acordă încă 50% din punctaj.

Exemplul 1

parcare.in

30 01 17 33
30 01 21 01
3
1

parcare.out

208

Explicație

Intrarea în parcare s-a făcut în data de 30 ianuarie ora 17:33. Plecarea s-a făcut în aceeași zi la ora 21:01. Deci timpul cât mașina a stat în parcare este 27 + 3*60 + 1 = 208 minute

Exemplu 2

parcare.in

30 01 17 33
30 01 21 01
3
2

parcare.out

12

Explicație

Tariful orar este 3 lei/oră. Se deduce că 208 minute = 3 ore și 28 minute, deci se plătesc 4 ore, 4 * 3 = 12.

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema Parcare:

#include <fstream>

using namespace std;

ifstream cin("parcare.in");
ofstream cout("parcare.out");

int hs, ms, hp, mp;
int zis, lus, zip, lup;
int t, cerinta;
char c1, c2;

int main()
{
    int x1, x2, x3, z1, z2, ore, minute;

    cin >> zis >> lus >> hs >> ms;
    cin >> zip >> lup >> hp >> mp;
    cin >> t;                       //tarif
    cin >> cerinta;                 //cerinta

    //punctul 1
    if (zis == zip)                 //aceiasi zi
        minute = hp * 60 + mp - (hs * 60 + ms);
    else
        {
            x1 = 24 * 60 - (hs * 60 + ms);//minute ziua sosire
            if (lus == lup)               //aceiasi luna
                x2 = (zip - 1 - (zis + 1) + 1) * 24 * 60; //zile intregi
            else                         //luna diferita
            {
                if (lus == 2)             //caz februarie -> martie
                    z1 = 28 - zis;
                else
                    if (lus == 4 || lus == 6 || lus == 9 || lus == 11)
                        z1 = 30 - zis;      //caz 30 zile
                    else
                        z1 = 31 - zis;      //caz 31 zile
                z2 = zip - 1;
                x2 = (z1 + z2) * 60 * 24;      //zile intregi
            }
            x3 = hp * 60 + mp;           //minute ziua plecare
            minute = x1 + x2 + x3;
        }
    if (cerinta == 1)                  //cerinta1
        cout << minute << '\n';
    else                               //cerinta2
      if (minute <= 15)
         cout << "0\n";               //nu se percepe taxa
      else
         {
            ore = minute / 60;        //ore intregi
            if (minute % 60 > 0)      //minute in plus
               ore++;                     //inca o ora
            cout << ore * t << '\n';
         }
    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #1470 Parcare

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1470 Parcare de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!