Cod sursa(job #971873)

Utilizator petrutsxMihaela Petruta Gaman petrutsx Data 10 iulie 2013 14:09:46
Problema Deque Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include<stdio.h>
#include<stdlib.h>

class Deque{
	public:
		int head, tail, NMAX, size;
		int *dequeArray;		

		Deque(int max){
			NMAX = max;
			dequeArray = new int[max];
			head = tail = 0;
			size = 0;
		}

		~Deque(){}

		void enqueue(int x){
			if(isFull())
				fprintf(stderr, "Queue is full!\n");
			else{
				dequeArray[tail] = x;
				tail = (tail + 1) % NMAX;
				size++;
			}
		}

		void dequeue(){
			if(isEmpty())
				fprintf(stderr, "Queue is empty!\n");
			else{
				head = (head + 1) % NMAX;
				size--;
			}
		}

		int front(){
			if(isEmpty()){
				fprintf(stderr, "Queue is empty!\n");
				int x;
				return x;
			}
			
			return dequeArray[head];
		}

		int isEmpty(){
			if(size == 0)
				return 1;
			return 0;
		}

		int isFull(){
			if(size == NMAX)
				return 1;
			return 0;
		}

		int findMin(){
			int i, min = 100000000;
			for(i=0; i<=NMAX-1; i++)
				if(dequeArray[i] < min)
					min = dequeArray[i];

			return min;
		}		
};

int main(){
	int i, K, N, min, x;
	long long S = 0;
	FILE *pf, *pg;
	
	pf = fopen("deque.in", "r");
	pg = fopen("deque.out", "w");

	fscanf(pf, "%d %d", &N, &K);
	class Deque D(K);

	min = 100000000;
	for(i=1; i<=K; i++){
		fscanf(pf, "%d", &x);
		if(x < min)
			min = x;
		D.enqueue(x);

	}
	S = S + min;
	for(i = 1; i <= N - K; i++){
		fscanf(pf, "%d", &x);
		if(D.front() != min){
			D.dequeue();
			D.enqueue(x);
			if(x < min)
				min = x;
			S = S + min;
		}

		else{
			D.dequeue();
			D.enqueue(x);
			
			min = D.findMin();
			S = S + min;
		}

	}
	
	fprintf(pg, "%lld\n", S);

	fclose(pf);
	fclose(pg);

	return 0;
}