sicily 2502 买珍珠

Description

珍珠市场上有 NN ≤ 100)种等级的珍珠,每种珍珠的需求数量是 Bi,单位价格是 Pi
不幸的是,这个市场是黑市——购买一种珍珠,需要额外多付10个同种珍珠的钱(如果不购买当然不用)。
针对这种情况,我们可以用高等级的珍珠来代替低等级的珍珠。
举个例子,
需要5个等级1的珠子(单位价格10元)、100个等级2的珠子(单位价格20元)。按照正常情况下购买需要花费 ( 5 +10 ) * 10 + ( 100 + 10 ) * 20 = 2350 元,如果用等级2的珠子代替等级1的珠子,只需要花费 ( 5 + 100 + 10 ) * 20 = 2300 元。
现在的问题是,应该如何购买珍珠才能在满足需求的条件下花费最少。

Input

第一行,一个整数 N,表示珍珠等级总数。
第二行, N个整数,按照等级从低到高描述每种珍珠的需求数量。
第二行, N个整数,按照等级从低到高描述每种珍珠的单位价格。
(当然价格也是递增的)。

Output

一个整数,表示最少花费。

Sample Input

2
5 100
10 20

Sample Output

2300

分析:

题目属于简单DP,需要注意的是本题要对数据进行简单的判断,可以节省编程时间。本题叙述不够充分,其实暗中已经示意高级珍珠的价格高于低级珍珠价格,即珍珠价格由低级到高级递增。略微有些坑,不过WA几次就能推断出来。

代码:

// Problem#: 2502
// Submission#: 1754411
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
// All Copyright reserved by Informatic Lab of Sun Yat-sen University
#include <iostream>
using namespace std;

int cost[100];
int q[100],p[100];

inline int min(int a, int b){
    return a<b?a:b;
}


int main(){
    int num,re;
    cin >> num;
    for( int i=0 ; i<num ; i++ ){
    cin >> q[i];
    if( i>0 ) q[i] += q[i-1];
    }
    for( int i=0 ; i<num ; i++ )
    cin >> p[i];
    for( int i=0 ; i<num ; i++ ){
    cost[i] = ( q[i]+10 ) *p[i];
    for( int j=0 ; j<i ; j++ )
        cost[i] = min((q[i]-q[j]+10)*p[i]+cost[j],cost[i]);     
    }
    cout << cost[num-1] << endl;
    return 0;
}                                 


你可能感兴趣的:(dp,ACM,sicily,soj)