Informatică, întrebare adresată de stefy24, 9 ani în urmă

Se dă un şir de N numere naturale. Din acest şir, putem forma un şir comprimat de forma: a[1], b[1], a[2], b[2], …, a[x], b[x], din care înţelegem că numărul a[1] apare pe primele b[1] poziţii, a[2] apare pe următoarele b[2] poziţii…, iar a[x] apare pe ultimele b[x] poziţii.

De exemplu, dacă şirul dat este 1 1 5 5 5 2, atunci şirul comprimat va fi 1 2 5 3 2 1.

Cerința
Să se determine:

a) Lungimea celei mai lungi secvenţe formată din numere egale.
b) Şirul comprimat pentru şirul dat.

Date de intrare
Fișierul de intrare sir6.in conține pe prima linie numerele P şi N. Pe următoarea linie se găseşte un şir format din N numere naturale.

Date de ieșire
Fișierul de ieșire sir6.out va conține pe prima linie:
a) Dacă P este 1, lungimea celei mai lungi secvenţe, reprezentând răspunsul la cerinţa a).
b) Dacă P este 2, şirul comprimat, reprezentând răspunsul la cerinţa b).

Restricții și precizări
N <= 100 000
Numerele din şir nu depăşesc 1 000 000.
P este 1 sau 2.

Răspunsuri la întrebare

Răspuns de express
6
#include <bits/stdc++.h>
using namespace std;
int v[100005], n, x, y, nr = 1, i, p, k, lmax;
int main()
{
   ifstream f("sir6.in");
   ofstream g("sir6.out");
   f >> p >> n;
   if(n == 1) lmax = 1;
   f >> y;
   v[++ k] = y;
   for(i = 2; i <= n; i ++)
     {
         f >> x;
         if(x == y)
         {
             nr ++;
             if(nr > lmax) lmax = nr;
         }
          else
         {
              v[++ k] = nr;
              v[++ k] = x;
              nr = 1;
         }
         y = x;
     }
     v[++ k] = nr;
     if(p == 1) g << lmax;
     if(p == 2)
     {
         for(i = 1; i <= k; i ++)
          g << v[i] << " ";
     }
    return 0;
}

Alte întrebări interesante