Rezolvare completă PbInfo #1222 TV

Comisia Naţională a Audiovizualului (CNA) este autoritatea care coordonează activitatea posturilor media din România. Șeful CNA-ului dorește o statistică referitoare la publicitatea transmisă de posturile de televiziune. În acest scop, el primește pentru fiecare zi informații în următorul format: d hh:mm:ss, unde d este durata exprimată în secunde a publicității, iar hh:mm:ss este momentul de start al publicității (hh este ora, mm este minutul, iar ss este secunda). Observaţi că d este separat de hh printr-un singur spaţiu, iar următoarele valori sunt separate prin caracterul ':'.

De exemplu o linie de forma:

150 05:02:45

se interpretează astfel: există un post TV care a transmis publicitate cu durata de 150 secunde, ora de început fiind 5, 2 minute și 45 de secunde.

”Secunda de aur” este o secundă în care se difuzează cât mai multă publicitate, adică pe un număr maxim de posturi în acea secundă se transmite publicitate. Dacă sunt mai multe astfel de secunde, “secunda de aur” este considerată prima secundă cu această proprietate în derularea zilei.

Șeful CNA primește în fiecare dimineață lista cu activitatea din ziua anterioară ca o succesiune de linii, fiecare linie având forma descrisă mai sus.

Cerinţe

Scrieţi un program care, cunoscând lista din ziua anterioară, să rezolve următoarele cerinţe:

  1. să determine durata totală în care niciun post de televiziune nu a difuzat publicitate;
  2. să determine care este “secunda de aur”.

Date de intrare

Fişierul de intrare tv.in conţine pe prima linie numărul natural c, care poate fi 1 sau 2, reprezentând cerinţa care urmează să fie rezolvată. Pe a doua linie se află numărul natural N, reprezentând numărul de linii din lista cu informații primită de șef. Pe următoarele N linii sunt descrise informațiile, în formatul specificat în enunţ.

Date de ieșire

Fişierul de ieşire tv.out va conţine o singură linie pe care vor fi scrise 3 numere naturale separate prin caracterul ':' în formatul următor:
hh:mm:ss
semnificând durata totală exprimată în ore (hh), minute (mm) şi secunde (ss) pe parcursul căreia niciun post de televiziune nu a difuzat publicitate în ziua respectivă (dacă c=1), respectiv “secunda de aur” (dacă c=2).

Restricții și precizări

  • 1 ≤ N ≤ 100000
  • hh va fi un număr de exact două cifre, cuprins între 00 şi 23
  • mm, respectiv ss vor fi numere de exact două cifre, cuprinse între 00 şi 59
  • Durata d este nenulă şi sfârşitul transmisiei publicităţii se află în cadrul zilei curente.
  • Pentru teste valorând 60% din punctaj cerinţa este 1.

Exemplul 1

tv.in

1
6
120 12:00:00
200 12:01:50
1000 13:00:00
2000 13:01:00
100 14:05:05
10 23:59:49

tv.out

23:18:40

Exemplul 2

tv.in

2
6
1200 12:00:00
2000 12:01:50
1000 12:00:00
2000 13:01:00
100 14:05:05
10 23:59:49

tv.out

12:01:50

Explicații

Pentru exemplul 1, cerinţa este 1. Pe parcursul zilei, timp de 23 de ore, 18 minute şi 40 de secunde nu s-a difuzat publicitate. Pentru exemplul 2, cerinţa este 2. Secunda de aur este 12:01:50 pentru că există un număr maxim posturi care difuzează publicitate (3 posturi).

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 TV:

//Octavian Dumitrascu - 100 puncte
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int sf, liber, yy, m1, s1, h1, d, c, ss, n, ma, p, timp, start, stop, i, h[100005];
char s[10];
int main()
{
    freopen("tv.in", "r", stdin);
    freopen("tv.out", "w", stdout);
    scanf("%d\n%d\n", &p, &n);
    for (i=1; i<=n; i++)
    {
        scanf("%d ",&d);
        gets(s);
        h1=(s[0]-48)*10+s[1]-48;
        m1=(s[3]-48)*10+s[4]-48;
        s1=(s[6]-48)*10+s[7]-48;
        start = s1 + m1*60 + h1*60*60;
        stop = start + d;
        h[start]++;
        h[stop]--;
    }
            ss = 0;
            liber = 0;
            ma = 0;
            for (i = 0; i < 60*60*24; i++)
            {
                ss += h[i];
                if (ss > ma) {ma = ss; timp = i;}
                if (ss == 0) liber++;
            }
        if (p == 1) yy = liber;
            else yy = timp;
        strcpy(s,"");
        h1 = yy/3600;
        m1 = yy%3600/60;
        s1 = yy%60;
        s[0]=h1/10+48;
        s[1]=h1%10+48;
        s[2]=':';
        s[3]=m1/10+48;
        s[4]=m1%10+48;
        s[5]=':';
        s[6]=s1/10+48;
        s[7]=s1%10+48;
        s[8]='\0';
        printf("%s\n", s);
    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 #1222 TV

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1222 TV 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!