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

Se consideră un şir A format din N elemente naturale nenule. Numim secvenţă de lungime K a şirului A orice succesiune de elemente consecutive din şir de forma Ai, Ai+1,…, Ai+K-1.
O secvenţă o numim secvenţă cool dacă elementele care o compun sunt distincte şi pot fi rearanjate astfel încât să alcătuiască o secvenţă continuă de numere consecutive.
De exemplu, considerând şirul A=(3,1,6,8,4,5,6,7,4,3,4), atunci secvenţa (8,4,5,6,7) este o secvenţă cool deoarece conţine elemente distincte ce pot fi rearanjate astfel încât să alcătuiască şirul de numere consecutive 4,5,6,7,8, pe când secvenţele (4,3,4), (6,7,4,3) nu sunt considerate secvenţe cool.

Cerinţă
Fiind dat un şir de N numere naturale nenule se cer următoarele:
1. Pentru o valoare dată K să se verifice dacă secvenţa A1, A2,…, AK este secvenţă cool. Dacă secvenţa este cool, atunci se va afişa cea mai mare valoare ce aparţine secvenţei. Dacă secvenţa nu este cool, atunci se va afişa numărul elementelor distincte din secvenţa A1, A2,…, AK, adică numărul elementelor care apar o singură dată.
2. Lungimea maximă a unei secvenţe cool şi numărul secvenţelor cool de lungime maximă.

Date de intrare
Fişierul de intrare cool.in conţine pe prima linie un număr natural p. Pentru toate testele de intrare, numărul p poate avea doar valoarea 1 sau valoarea 2. Pe linia a doua se găsesc, despărţite printr-un spaţiu, două numere naturale N K. Pe următoarea linie se găsesc N numere întregi, separate prin câte un spaţiu, ce reprezintă elementele şirului.

Date de ieşire
Dacă valoarea lui p este 1, atunci se va rezolva numai punctul 1 din cerinţă. În acest caz, fişierul de ieşire cool.out va conţine pe prima linie un număr natural, număr ce reprezintă conform cerinţei 1, maximul secvenţei A1, A2,…, AK, dacă secvenţa este secvenţă cool, sau numărul elementelor distincte din secvenţă, dacă aceasta nu este secvenţă cool.
Dacă valoarea lui p este 2, se va rezolva numai punctul 2 din cerinţă. În acest caz, fişierul de ieşire cool.out va avea două linii. Prima linie va conţine un număr natural nenul ce reprezintă lungimea maximă a unei secvenţe cool, iar următoarea linie un număr natural nenul ce reprezintă numărul de secvenţe cool care au lungimea maximă.

Restricţii
• 1 ≤ N ≤ 5000
• 2 ≤ K ≤ 1000
• 1 ≤ Ai ≤ 1000, 1 ≤ i ≤ N

Răspunsuri la întrebare

Răspuns de express
2
#include <fstream>
#include <algorithm>
#include <cstring>
using namespace std;
int v[5001],w[1005],t[5001],vw[5001];
int nrd,S,in,sf,nr,p,n,k,x,i,j,maxx,minn=2000000005,m,M;

bool ok;
int main()
{
    ifstream f("cool.in");
    ofstream g("cool.out");
    f>>p;
    f>>n>>k;
    for(i=1;i<=n;i++)
    {
        f>>x;
        t[i]=x;
        v[x]=v[x]+1;
        if (i<=k)
        {
            vw[x]=vw[x]+1;
            if(x<minn) minn=x;
        }
    }
    if(p==1)
    {
        ok=true;
        for(i=minn;i<=minn+k-1;i++)
          if (vw[i]!=1) ok=false;
        if (ok) g<<minn+k-1;
          else
          {
           for(i=1;i<=5000;i++)
             if (vw[i]==1) nrd++;
           g<<nrd;
          }
    }
    if(p==2)
    {
     S=0;
     for (i=1;i<=n;++i)
     {
         for (j=i;j<=n;++j)
        {
         if (i==j) m=2000000005,M=0;
         sf=max(M,t[j]);
         in=min(m,t[j]);
         if (w[t[j]]) break;
         ++w[t[j]];
         m=in; M=sf;
         k=j-i+1;
         if ((in+k-1==sf))
            {
             if (maxx==k) nr++;
             else if (maxx<k) nr=1,maxx=max(maxx,k);
            }
         }
         memset(w,0,sizeof(w));
     }
     g<<maxx<<"\n"<<nr;
}
    f.close();
    g.close();
    return 0;
}


vic2002: Mersi
Alte întrebări interesante