Pagini recente » Cod sursa (job #57945) | Cod sursa (job #2442457) | Cod sursa (job #686380) | Cod sursa (job #2109824) | Cod sursa (job #254331)
Cod sursa(job #254331)
#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
w[i]=h[i]; w[j]=h[j]; //pt inceput inaltimile capetelor sunt aceleasi
while(i!=j) //cat timp nu leam unit....deci nu avem toate cuburile intr-un singur turn
{
a=v[i]+w[i]; //calculam costul cu care am muta din partea stanga
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+1]+=a; w[i+1]+=w[i]+h[i+1]; i++; }
else { v[j-1]+=b; w[j-1]+=w[j]+h[j-1]; j--; }
}
printf("%d %lld\n",i,v[i]); //afisem pozitia si costul
for(i=1;i<=10000;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
if(y<x) x=y;
fai_raspuns(h,v,w,x,y); //calculam si afisem pozitia si costul
}
fclose(stdin);
fclose(stdout);
return 0;
}