[NOIP][C++]洛谷P1376 [USACO05MAR] Yogurt factory 机器工厂

P1376 [USACO05MAR] Yogurt factory 机器工厂

https://www.luogu.com.cn/problem/P1376

题目描述

小 T 开办了一家机器工厂,在 N N N 个星期内,原材料成本和劳动力价格不断起伏,第 i i i 周生产一台机器需要花费 C i C_i Ci 元。若没把机器卖出去,每保养一台机器,每周需要花费 S S S 元,这个费用不会发生变化。

机器工厂接到订单,在第 i i i 周需要交付 Y i Y_i Yi 台机器给委托人,第 i i i 周刚生产的机器,或者之前的存货,都可以进行交付。

请你计算出这 n n n 周时间内完成订单的最小代价。

输入格式

第一行输入两个整数 N N N 和 S S S,接下来 N N N 行每行两个数 C i C_i Ci 和 Y i Y_i Yi。

输出格式

输出一个整数,表示最少的代价。

输入输出样例 #1

输入 #1

复制代码
4 5
88 200
89 400
97 300
91 500

输出 #1

复制代码
126900

说明/提示

对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 1 0 4 1 \le n\le 10^4 1≤n≤104, 1 ≤ C i ≤ 5000 1 \le C_i \le 5000 1≤Ci≤5000, 1 ≤ S ≤ 100 1 \le S \le 100 1≤S≤100, 0 ≤ Y i ≤ 1 0 4 0 \le Y_i \le 10^4 0≤Yi≤104。

题解

这题需要注意不开long的话只能拿90分。不开long两行泪啊!!!

典型的贪心算法,两个for循环搞定~

cpp 复制代码
#include<iostream>
using namespace std;

int main(){
    long week_num,save,c_i,y_i,sum=0,min;
    long cost_list[100000];
    cin >> week_num >> save;
    for(int i=0;i<week_num;i++){
        cin >> c_i >> y_i;
        cost_list[i]=c_i; // 如果在第i周生产,所需要的费用
        min=c_i;
        for(int j=0;j<i;j++){
            int cost_j=cost_list[j]+(i-j)*save; // 如果在第j周生产,所需要的费用
            if(cost_j<min){
                min=cost_j;
            }
        }
        sum+=min*y_i;
    }
    cout<<sum;
    return 0;
}

走过路过别错过,留个关注留个赞~