Am rezolvat problema pentru 70p pe pbinfo. La teste se presupune ca am depasit limita de timp (-30 punct).
Cod/ideas pentru 100p.
Se dă un șir cu n numere naturale și un număr k.
Cerinţa
Să se determine o secvență de elemente de lungime k cu suma elementelor maximă.
Date de intrare
Fişierul de intrare secvk.in conţine pe prima linie numerele n și k, iar pe a doua linie n numere naturale separate prin spaţii.
Date de ieşire
Fişierul de ieşire secvk.out va conţine pe prima linie k numere, reprezentând elementele secvenței cerute.
Restricţii şi precizări
1 ≤ k ≤ n ≤ 100000
numerele de pe a doua linie a fişierului de intrare vor fi mai mici decât 1000
dacă există mai multe secvențe de lungime k cu suma maximă se va afișa prima
Exemplu
secvk.in
8 3
5 6 1 2 6 6 4 3
secvk.out
6 6 4
Explicație
Sumele care se pot obține sunt: 12 9 9 14 16 13. Suma maximă este 16 și se obține pentru secvența 6 6 4
Zlatan:
Foloseşti un deque. La fiecare moment, faci o inserare la sfarsitul lui si calculezi suma curenta. Daca pozitia actuala din vector este > k, faci o stergere de la început, apoi adaugi la sfarsit. Complexitate : O(n)
Răspunsuri la întrebare
Răspuns de
4
#include<cstdio>
#include<deque>
#define MAX_N 100000
using namespace std;
int v[MAX_N+1], n, k;
deque<int>deck;
int main()
{
int i, smax, sum, Begin, End;
FILE *fin, *fout;
fin = fopen("secvk.in","r");
fout = fopen("secvk.out","w");
fscanf(fin,"%d%d",&n,&k);
for(i=1; i<=n; i++)
fscanf(fin,"%d",&v[i]);
smax = -1;
sum = 0;
Begin = End = 0;
for(i=1; i<=n; i++)
{
if(i <= k)
{
sum += v[i];
deck.push_back(v[i]);
if(i == k && sum > smax)
{
smax = sum;
End = k;
Begin = End - k + 1;
}
}
else
{
sum -= deck.front();
sum += v[i];
deck.pop_front();
deck.push_back(v[i]);
if(sum > smax)
{
smax = sum;
End = i;
Begin = End - k + 1;
}
}
}
for(i=Begin; i<=End; i++)
fprintf(fout,"%d ",v[i]);
fprintf(fout,"\n");
fclose(fout);
fclose(fin);
return 0;
}
#include<deque>
#define MAX_N 100000
using namespace std;
int v[MAX_N+1], n, k;
deque<int>deck;
int main()
{
int i, smax, sum, Begin, End;
FILE *fin, *fout;
fin = fopen("secvk.in","r");
fout = fopen("secvk.out","w");
fscanf(fin,"%d%d",&n,&k);
for(i=1; i<=n; i++)
fscanf(fin,"%d",&v[i]);
smax = -1;
sum = 0;
Begin = End = 0;
for(i=1; i<=n; i++)
{
if(i <= k)
{
sum += v[i];
deck.push_back(v[i]);
if(i == k && sum > smax)
{
smax = sum;
End = k;
Begin = End - k + 1;
}
}
else
{
sum -= deck.front();
sum += v[i];
deck.pop_front();
deck.push_back(v[i]);
if(sum > smax)
{
smax = sum;
End = i;
Begin = End - k + 1;
}
}
}
for(i=Begin; i<=End; i++)
fprintf(fout,"%d ",v[i]);
fprintf(fout,"\n");
fclose(fout);
fclose(fin);
return 0;
}
Alte întrebări interesante
Matematică,
8 ani în urmă
Matematică,
8 ani în urmă
Matematică,
9 ani în urmă
Engleza,
9 ani în urmă
Studii sociale,
9 ani în urmă
Matematică,
9 ani în urmă