题意:
大体意思就是有一家酸奶工厂,给出每一周的酸奶需求量和这一周制造每升酸奶的价格,然后每一周的价格都不同,每一周可以无限的生产酸奶,多出当周需求量的可以存在仓库中(仓库无限大并且仓库永远不会变质),给出每升酸奶存放一周的价格。问:如何生产使得完成这些周的生产量所需的成本最小
解题思路:
这道题是很明显的贪心。只要每一周的生产成本最小,则给出的所有周的成本自然最小。第一周的需求量肯定是要第一周完成,以后的每一周需要和前一周的比较,看是这个周生产的划算,还是利用上一周生产划算。如果要在上一周把这一周的量生产出来,则成本要加上储存的费用。对酸奶构造一个结构体变量,包括酸奶的成本单价和当周的需求量。先把第一周的算出来,之后用for循环,把若本周生产需要的费用和上周生产需要的费用做比较,总费用加上小的那个。循环完毕之后返回总费用totalcost。
感想:
这道题刚开始就没看明白,后来做了很多次,提交都没有通过,后来又看了一遍题目,发现题目后面有一句话说用32位的整数太小了,然后我才转用了long long类型,我之前做的思路是先把第一周的算出来,然后的几周分别和前面的几周做比较,从中找到一个最省钱的,但是这样的话提交就会超时,从百度上看只和前一周的比较就可以,但是我觉得既然是贪心,就要把前几周的一块比较,这样才能找到最省钱的一周。
代码如下:
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
struct Yogurt
{
int Price;
int NeedQuantity;
};
int leastCost(int n, int a, Yogurt y[])//n:有几周 a:每升酸奶存放一周的价格 y数组从下标1开始
{
int TotalCost = 0;
TotalCost = TotalCost + y[1].Price*y[1].NeedQuantity;
for (int i = 2; i <= n; i++)
{
if ((y[i].Price*y[i].NeedQuantity) > (y[i - 1].Price*y[i].NeedQuantity + y[i].NeedQuantity*a))
TotalCost = TotalCost + y[i - 1].Price*y[i].NeedQuantity + y[i].NeedQuantity*a;
else
TotalCost = TotalCost + y[i].Price*y[i].NeedQuantity;
}
return TotalCost;
}
int main()
{
int weeks, StorePrice,TotalCost=0;
Yogurt y[10000];
cin >> weeks >> StorePrice;
for (int i = 1; i <= weeks; i++)
cin >> y[i].Price >> y[i].NeedQuantity;
TotalCost = leastCost(weeks, StorePrice, y);
cout << TotalCost << endl;
return 0;
}