真的不要怕做贪心的题目,原理都很简单。
题目描述
小 T 开办了一家机器工厂,在 N个星期内,原材料成本和劳动力价格不断起伏,第 i 周生产一台机器需要花费 Ci 元。若没把机器卖出去,每保养一台机器,每周需要花费 S 元,这个费用不会发生变化。
机器工厂接到订单,在第 i 周需要交付 Yi 台机器给委托人,第 i 周刚生产的机器,或者之前的存货,都可以进行交付。
请你计算出这 n 周时间内完成订单的最小代价。
输入格式
第一行输入两个整数 N 和 S,接下来 N 行每行两个数 Ci 和 Yi。
输出格式
输出一个整数,表示最少的代价。
输入输出样例
输入 #1
4 5 88 200 89 400 97 300 91 500
输出 #1
126900
说明/提示
1≤n≤10^4,1≤Ci≤5000,1≤S≤100,0≤Yi≤10^4。
代码
#include<iostream>
#include<algorithm>
using namespace std;
struct item{//建立结构体存放机器生产的价钱c和需要生产的台数y。
long long c,y;
}it[10004];
int main()
{
long long n,s;//这里需要注意定义数据类型的时候需要定义为long long类型,否则会有测试数据不通过
cin>>n>>s;
for(long long i=1;i<=n;i++){
cin>>it[i].c>>it[i].y;
}
long long money=it[1].c*it[1].y;//在第一周时只能生产第一台机器。
for(long long i=2;i<=n;i++){//从第二周开始就要使用贪心算法
long long x=it[i].c*it[i].y;//每次都对比当前第i周和前i-1周生产机器产生的费用。
for(long long j=1;j<i;j++){
if((it[j].c+(i-j)*s)*it[i].y<x){//寻找最小值
x=(it[j].c+(i-j)*s)*it[i].y;
}
}money+=x;
// cout<<x<<"\n";
}cout<<money;
return 0;
}