Cod sursa(job #622656)

Utilizator ContraPunctContrapunct ContraPunct Data 18 octombrie 2011 12:42:54
Problema Deque Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.38 kb
#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;
}