Cod sursa(job #254297)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 7 februarie 2009 10:52:04
Problema Cuburi2 Scor 0
Compilator c Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 2 Marime 1.57 kb
#include<stdio.h>
#define infile "cuburi2.in"
#define outfile "cuburi2.out"
#define nmax (10*1000+1)
int h[nmax]; //vectorul cu inaltimile turnurilor
long long w[nmax]; //vectorul in care calculam inaltimile partiale
long long v[nmax]; //vectorul in care calculam mereu mutarile
int n; //numarul de turnuri
int t; //numarul de teste

void citire(int h[nmax], int *n, int *t)
	{
	int i;
	scanf("%d %d\n",n,t);
	for(i=1;i<=*n;i++) //citim inaltimea fiecarui turn
		scanf("%d",&h[i]);
	}

void fai_raspuns(int h[nmax], long long v[nmax], long long w[nmax], int x, int y)
	{
	long long a,b;
	int i=x,j=y; //cele doua capete ale intervalului
	while(i!=j) //cat timp nu leam unit....deci nu avem toate cuburile intr-un singur turn
		{
		//calculam pentru partea stanga
		w[i]=h[i]+w[i-1]; //ne calculam intai inaltimea
		a=v[i]+w[i]; //calculam costul cu care am muta
		
		//calculam pentru partea dreapta
		w[j]=h[j]+w[j+1]; //ne calculam inaltimea
		b=v[j]+w[j]; //calculam costul cu care am muta din partea dreapta
		
		//inaintam cu cel de cost minim
		if(a<b) v[++i]+=a;
		else v[--j]+=b;
		}
	
	printf("%d %d\n",i,v[i]); //afisem pozitia si costul
	for(i=x;i<=y;i++)
		v[i]=w[i]=0; //golim vectorii
	}

int main()
{
int x,y;
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);

citire(h,&n,&t); //citim datele din fisier
while(t--) //avem teste de facut
	{
	scanf("%d %d",&x,&y); //citim intervalul pt care trebuie sa facem raspunsul
	fai_raspuns(h,v,w,x,y); //calculam si afisem pozitia si costul
	}

fclose(stdin);
fclose(stdout);
return 0;
}