Pagini recente » Cod sursa (job #2011962) | Cod sursa (job #1262076) | Cod sursa (job #2297536) | Cod sursa (job #510129) | Cod sursa (job #254297)
Cod sursa(job #254297)
#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;
}