题目大意:
给定n种珠宝
每种珠宝两个数据,a[i]代表数量,p[i]代表单价
按 p[i]从小到大排。
购买珠宝时要满足以下购买规则:
单独买:每种珠宝要加上数量10
合并买:可以把连续几种珠宝数量合并,再加上10,单价按照price最大的计算
求出购买所有的珠宝最少要花费多少
解题思路:
直接把a[i]合并为前缀和。
f[i]表示买到第i种珠宝的最优值。
设从第j种开始一起买。
则f[i]=min(f[i],f[j-1]+(a[i]-a[j-1]+10)*p[i]),1<=j<=i;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#define ll long long
using namespace std;
int getint()
{
int i=0,f=1;char c;
for(c=getchar();(c<'0'||c>'9')&&c!='-';c=getchar());
if(c=='-')c=getchar(),f=-1;
for(;c>='0'&&c<='9';c=getchar())i=(i<<3)+(i<<1)+c-'0';
return i*f;
}
const int N=105,INF=0x3f3f3f3f;
int T,n;
int a[N],p[N],f[N];
int main()
{
//freopen("lx.in","r",stdin);
T=getint();
while(T--)
{
memset(f,INF,sizeof(f));
f[0]=0;
n=getint();
for(int i=1;i<=n;i++)
a[i]=getint()+a[i-1],p[i]=getint();
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
f[i]=min(f[i],f[j-1]+(a[i]-a[j-1]+10)*p[i]);
cout<<f[n]<<'\n';
}
}