Pagini recente » Istoria paginii runda/oji_9 | Cod sursa (job #382280) | Cod sursa (job #2176520) | Cod sursa (job #411380) | Cod sursa (job #1331085)
/*
Enunt:
Deque
Se da un sir A cu N numere intregi. Pentru fiecare subsecventa de lungime K sa se determine minimul, iar apoi sa se calculeze suma acestor minime.
Cerinta
Sa se afiseze suma ceruta.
Date de intrare
Pe prima linie a fisierului deque.in se afla numerele N si K cu semnificatia din enunt. Pe urmatoarele N linii se afla cate un numar intreg din sirul dat.
Date de ieşire
In fisierul de iesire deque.out se va afla un singur numar intreg reprezentand suma ceruta.
Restrictii si precizari
1 ≤ N ≤ 5 000 000
1 ≤ K ≤ N
Elementele din sir vor avea valori cuprinse intre -10 000 000 si 10 000 000
Pentru rezultat se recomanda folosirea tipurilor intregi pe 64 de biti
Exemplu
deque.in
9 3
-7
9
2
4
-1
5
6
7
1
deque.out
-2
Explicaţie
Minimele corespunzatoare fiecarei subsecvente de lungime 3 sunt: -7 2 -1 -1 -1 5 1, suma acestora fiind -2.
*/
/*
Rezolvare:
*/
#include <stdio.h>
FILE *in, *out;
int n, k, a[5000001];
long long s;
int main ()
{
int i, j, min, pos;
in = fopen("deque.in", "r");
out = fopen("deque.out", "w");
fscanf(in, "%d", &n);
fscanf(in, "%d", &k);
for (i=1; i<=n; i++)
{
fscanf(in, "%d", &a[i]);
}
min = a[1];
pos = 1;
for (i=2; i<=k; i++)
{
if (a[i] < min)
{
min = a[i];
pos = i;
}
}
s = min;
for (i=k+1; i<=n; i++)
{
// daca minimul nu mai intra in intervalul nostru
if (pos < i-k+1)
{
min = a[i-k+1];
pos = i-k+1;
for (j=i-k+2; j<=i; j++)
{
if (a[j] < min)
{
min = a[j];
pos = j;
}
}
}
else
{
// verficam daca mai avem un minim cu aceiasi valoare la pozitia curenta
if (a[i] == min)
{
pos = i;
}
// verificam daca minimul nostru este mai mic decat pozitia curenta, adica s-a schimbat
if (a[i] < min)
{
min = a[i];
pos = i;
}
}
// adaugam la suma minimul pentru secventa (i-k+1, i)
s = s + min;
}
fprintf(out, "%lld\n", s);
fclose(out);
fclose(in);
return 0;
}