poj1260

给定n类等级的珍珠

每类的珍珠都有需求的个数ai,和价格pi

为了防止游客只买1颗珍珠,所以购买ai个珍珠时,要加上10个的价格

即(ai+10)*pi

有时,购买高等级的珍珠代替低等级的珍珠时,可能更便宜,

比如说

2

5 5

100 10 这样的数据

(5+10)*5 + (100+10)*100 = 1175

(100+10+5)*10 = 1150

题目要求我们求最小的花费

a < b < c < d

如果b用c替换时,那么d是不可能替换a的,

用c替换a明显更优,所以只要考虑连续的一段是不是被替换了即可

dp[i]购买前i类珍珠的最小花费

那么dp[i] = min(dp[i],dp[j] + (sum[i]-sum[j-1]+10)*p[i])

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #include <algorithm>
 5 #include <iostream>
 6 #include <queue>
 7 #include <stack>
 8 #include <vector>
 9 #include <map>
10 #include <set>
11 #include <string>
12 #include <math.h>
13 using namespace std;
14 #pragma warning(disable:4996)
15 #pragma comment(linker, "/STACK:1024000000,1024000000")
16 typedef long long LL;                   
17 const int INF = 1<<30;
18 /*
19 a < b < c < d
20 会不会发生b用c替换,a用d替换呢?
21 不会,因为pc*a < pd*a
22 所有如果c没有被d替换,那么c之前的也不会被d替换,
23 所有只要考虑连续的一段是不是被替换了即可
24 */
25 const int N = 1000 + 10;
26 int a[N], p[N], sum[N];
27 int dp[N];
28 int main()
29 {
30     int t, n;
31     scanf("%d", &t);
32     while (t--)
33     {
34         scanf("%d", &n);
35         for (int i = 1; i <= n; ++i)
36         {
37             scanf("%d%d", &a[i], &p[i]);
38             sum[i] = a[i];
39             sum[i] += sum[i - 1];
40         }
41         
42         for (int i = 1; i <= n; ++i)
43         {
44             dp[i] = INF;
45             for (int j = 0; j < i; ++j)
46             {
47                 dp[i] = min(dp[i],dp[j] + (sum[i] - sum[j] + 10)*p[i]);
48             }
49         }
50         printf("%d\n", dp[n]);
51     }
52     return 0;
53 }
View Code

 

posted @ 2015-08-14 16:07  justPassBy  阅读(198)  评论(0编辑  收藏  举报