POJ 2393 Yogurt Factory

POJ 2393题目大意如下:

这是一个费用问题,实际背景是生产酸奶,工程分为N周,指定每周存储酸奶的费用为S,给出每周的单位酸奶制造成本以及客户需求量,要求给出最佳的生产方案,使得总的花费最少。

可以使用一个二维数组,分别存储原定该周的酸奶制造成本,以及涮选后的酸奶制造成本,关于涮选后的酸奶制造成本可以这样涮选:与前一周的新的制造成本做比较

        if (exp[i][0] > exp[i - 1][1] + S) {
            exp[i][1] = temp;
        }
        else exp[i][1] = exp[i][0];

可能会想,为什么只考虑前面一周的更新成本,而不考虑之前其他周的制造成本?根据更新原理,之前一周的更新成本相当于已经是和之前的更新成本做比较的结果了,所以不需要再和之前的更新结果作类似于

第i周和第k周:
比较成本:
exp[i][0] + (k - i)*S < exp[k][0];

是不需要的,以下为AC代码:

#include 
#include 
#include 
#include 

using namespace  std;
const int maxn = 10000;
int exp[maxn + 1][2];
int dem[maxn + 1];

int N, S;

void solve() {
    int i = 1;
    unsigned long long sum = exp[0][0]*dem[0];
    exp[0][1] = exp[0][0];
    while (i < N) {
        int temp = exp[i - 1][1] + S;
        if (exp[i][0] > exp[i - 1][1] + S) {
            exp[i][1] = temp;
        }
        else exp[i][1] = exp[i][0];
        sum += exp[i][1]*dem[i];
        i++;
    }
    printf("%llu\n", sum);
}

int main(int argc, const char * argv[]) {
    // insert code here...
    scanf("%d %d", &N, &S);
    for (int i = 0; i < N; i++) {
        scanf("%d %d", &exp[i][0], &dem[i]);
    }
    solve();
    return 0;
}

Accept 816K / 47MS

你可能感兴趣的:(程序竞赛,算法)