【传送门:BZOJ1680】
简要题意:
奶牛经营了一家酸奶工厂,生意非常红火。在接下去的N 个月里,第i 个月需要向社会提供Ai 吨酸奶。酸奶的生产受到很多因素的影响,所以每个月的生产成本是变化的,其中第i 个月的成本是 每吨Ci 元。 奶牛可以提前里把酸奶做好,存在仓库里,等需要的时候再拿出来卖。存储在仓库里的酸奶,每吨酸奶存放一个月需要支付S 元的维护费用,存放的时间可以任意长。假设工厂的产量是无限的,存 储酸奶的仓库也是无限大的。请问为了满足订单的需要,奶牛生产这些酸奶最少要花多少钱?
输入格式:
• 第一行:两个整数N 和S,1 ≤ N ≤ 10000, 1 ≤ S ≤ 100
• 第二行到第N + 1 行:第i + 1 行有两个整数Ci 和Ai,1 ≤ Ci ≤ 5000, 1 ≤ Ai ≤ 10000
输出格式:
• 单个整数:表示生产酸奶的最小总费用
样例输入:
4 5
88 200
89 400
97 300
91 500
样例输出:
126900
样例解释:
第一个月生产200 吨酸奶;第二个月生产 700 吨酸奶,并存下300 吨;第三个月不生产酸 奶;第三个月生产500 吨
题解:
贪心,p[i]表示第i个月的成本(包括存放的成本),那么我们在处理p[i]的时候,保证p[i-1]是最小成本,那么p[i]=min(p[i-1]+s,c[i])
参考代码:
#include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<cmath> using namespace std; typedef long long LL; int c[11000],a[11000],p[11000]; int main() { int n,s; scanf("%d%d",&n,&s); for(int i=1;i<=n;i++) scanf("%d%d",&c[i],&a[i]); LL ans=0; p[0]=999999999; for(int i=1;i<=n;i++) { p[i]=min(p[i-1]+s,c[i]); ans+=p[i]*a[i]; } printf("%lld ",ans); return 0; }