Pagini recente » Cod sursa (job #2851942) | Cod sursa (job #3258306) | Cod sursa (job #2151921) | Cod sursa (job #192647) | Cod sursa (job #622656)
Cod sursa(job #622656)
#include<cstdio>
/*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 deque.out
9 3 -2
-7
9
2
4
-1
5
6
7
1
*/
#define Nmax 5000000
int n,k ;
//int coada[Nmax],ul,pr;
long Suma_minime;
struct deque
{
long val;
deque *stg,*drp;
} ;
deque *pr, *ul,*node;
FILE * f, * g;
long Minim()//deque * pr, deque * ul)
{
long minlocal = 10000000;
deque *node;
node=pr;
while(node!=NULL)
{
if( minlocal > node->val)
{
minlocal = node->val;
}
node=node->drp;
}
return minlocal;
}
long Sol()
{
long i, min, suma = 0, a;
pr = new deque();
ul = new deque();
pr->stg = NULL;
pr->drp = ul;
ul->drp = NULL;
ul->stg = pr;
fscanf(f,"%ld %ld",&n,&k);
fscanf(f,"%ld",&a);
ul->val = a;
fscanf(f,"%ld",&a);
pr->val = a;
for( i = 2; i < k; i++)
{
fscanf(f,"%ld",&a);
node = new deque();
pr->stg = node;
node->val = a;
node->drp=pr;
node->stg=NULL;
pr=node;
}
min = Minim();
Suma_minime = min;
for(;i<n; i++)
{
long ultimElement = ul->val;
fscanf(f,"%ld",&a);
node = ul;
ul=ul->stg;
ul->drp=NULL;
delete node;
node = new deque();
node->val = a;
node->stg = NULL;
node->drp = pr;
pr->stg = node;
pr = node;
if(min == ultimElement)
{
min=Minim();
Suma_minime+=min;
}
else
{
Suma_minime+=min;
}
}
return Suma_minime;
}
int main(int argc, char **argv)
{
f = fopen("deque.in","r");
g = fopen("deque.out","w");
Sol();
fprintf(g,"%ld\n",Suma_minime);
fclose(f);
fclose(g);
return 0;
}