Cod sursa(job #625491)

Utilizator ContraPunctContrapunct ContraPunct Data 24 octombrie 2011 20:22:14
Problema Deque Scor 25
Compilator cpp Status done
Runda Arhiva educationala Marime 2.42 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;
int Suma_minime;
struct deque
{
    int val;
    deque *stg,*drp;
} ;
deque *pr, *ul,*node;
FILE * f, * g;
int Minim()//deque * pr, deque * ul)
{
    int minlocal = 10000000;
	deque *node;
	node=pr;
    while(node!=NULL) 
    { 
        if( minlocal > node->val)
        {
            minlocal = node->val;
        }
		node=node->drp;		
    }  
return minlocal;
}

int Sol()
{
    int 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,"%d %d",&n,&k);
  
    fscanf(f,"%d",&a);
    ul->val = a;
	fscanf(f,"%d",&a);
	pr->val = a;
    for( i = 2; i < k; i++)
    {               
        fscanf(f,"%d",&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++)
    {
        int ultimElement = ul->val;
        fscanf(f,"%d",&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 > a)
		{
			min = a;
			Suma_minime+=min;
		}
		else
        if(min ==  ultimElement)
        {
        min=Minim();
        Suma_minime+=min;
        }
        else
        {
        Suma_minime+=min;
        }
    }
    return suma;
}

int main(int argc, char **argv)
{
    
    f = fopen("deque.in","r");
    g = fopen("deque.out","w");
    Sol();
    fprintf(g,"%d\n",Suma_minime);
    fclose(f);
    fclose(g);
    return 0;
}