思路:
每天要么以今天的价格买入,要么前面某天买了存在仓库里。不存在一半是今天买的,一半是从仓库拿的,这种情况。
因为如果这样,肯定有一半具有更高的性价比,那就全部都改成更高性价比的方式就好了。。
所以,这题只需要保存一个当前的最大值,扫描一遍就能出结果了。瞬间就沦为一道水题了。还以为要大动作的呢。
#include <stdio.h>
__int64 N, S;
__inline __int64 min(__int64 a, __int64 b)
{
return a < b ? a : b;
}
int main()
{
__int64 best, i, c, y, sum, inc;
freopen("e:\\test\\in.txt", "r", stdin);
scanf("%I64d%I64d", &N, &S);
best = 1LL << 60;
sum = 0;
inc = (N - 1) * S;
for (i = 0; i < N; i++) {
scanf("%I64d%I64d", &c, &y);
best = min(best, c + inc);
sum += y * (best - inc);
inc -= S;
}
printf("%I64d\n", sum);
return 0;
}