Description
珍珠市场上有 N( N ≤ 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几次就能推断出来。
代码:
1 // Problem#: 2502 2 // Submission#: 1754411 3 // The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License 4 // URI: http://creativecommons.org/licenses/by-nc-sa/3.0/ 5 // All Copyright reserved by Informatic Lab of Sun Yat-sen University 6 #include <iostream> 7 using namespace std; 8 9 int cost[100]; 10 int q[100],p[100]; 11 12 inline int min(int a, int b){ 13 return a<b?a:b; 14 } 15 16 17 int main(){ 18 int num,re; 19 cin >> num; 20 for( int i=0 ; i<num ; i++ ){ 21 cin >> q[i]; 22 if( i>0 ) q[i] += q[i-1]; 23 } 24 for( int i=0 ; i<num ; i++ ) 25 cin >> p[i]; 26 for( int i=0 ; i<num ; i++ ){ 27 cost[i] = ( q[i]+10 ) *p[i]; 28 for( int j=0 ; j<i ; j++ ) 29 cost[i] = min((q[i]-q[j]+10)*p[i]+cost[j],cost[i]); 30 } 31 cout << cost[num-1] << endl; 32 return 0; 33 }