Pagini recente » Cod sursa (job #102493) | Cod sursa (job #2397008) | Cod sursa (job #2653425) | Cod sursa (job #1820688) | Cod sursa (job #68380)
Cod sursa(job #68380)
#include <cstdio>
#define FIN "branza.in"
#define FOUT "branza.out"
#define MAX 100004
#define tip numar
#define tip_cifra char
#define CIFRE 25
long C[MAX], P[MAX];
long n, S, T;
long i,j, dep,qty;
class numar {
public:
tip_cifra a[CIFRE];
int nr;
void operator=(long long x) {
long old = nr; nr = 0;
while ( x ) {
a[++nr] = x%10;
x/=10;
}
while ( old>nr )
a[old--]=0;
}
void operator+=(numar x) {
long i;
tip_cifra t = 0;
for (i=1; i<=nr || i<=x.nr || t; ++i, t/=10)
a[i] = (t += a[i]+x.a[i]) % 10;
nr = i-1;
}
void operator+=(long long x) {
numar b;
b.nr = 23;
b = x;
*this += b;
}
bool operator<(numar x) {
if ( nr<x.nr )
return true;
if ( nr>x.nr )
return false;
// a[0] == x.a[0]
long i=nr;
while (i && a[i] == x.a[i])
--i;
return (a[i]<x.a[i]);
}
};
tip A[MAX], nou;
int main() {
freopen(FIN, "r", stdin);
scanf("%ld %ld %ld", &n, &S, &T);
for (i=0; i<n; ++i)
scanf("%ld %ld", C+i, P+i);
fclose(stdin);
for (i=n-1; i>=0; --i) {
A[i] = (long long)P[i] * C[i];
A[i] += A[i+1];
dep = 0; qty = P[i];
for (j=i+1; j<n && j-i<=T; ++j) {
dep += (j-i)*P[j];
qty += P[j];
nou = (long long) S*dep ;
nou += (long long) C[i]*qty;
nou += A[j+1];
if ( nou<A[i] )
A[i] = nou;
}
}
freopen(FOUT, "w", stdout);
for (i=A[0].nr; i; --i)
printf("%d", A[0].a[i]);
printf("\n");
fclose(stdout);
return 0;
}