有三个整数a,n,m,a是终点坐标,给出n个范围(l,r)表示这块区域下雨,m把伞(p,w)在点p有重量为w的伞。
小明可以携带任意数量的伞,经过下雨处时必须要撑伞,小明每走一个单位长度消耗的体力与他所携带伞的重量相同,
求小明从0~a所需消耗的最少体力,若无解则输出-1。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cmath>
#include <map>
using namespace std;
int a,n,m;
int rain[2005];
int umb[2005][2];
long long dp[2005];
long long inf=1e18+7;
int main() {
while(~scanf("%d%d%d",&a,&n,&m))
{
memset(rain,0,sizeof(rain));
for(int i=0;i<=2000;i++)
dp[i]=inf;
for(int i=1;i<=n;i++)
{
int l,r;
scanf("%d%d",&l,&r);
for(int j=l;j<=r;j++)
rain[j]=i;
}
for(int i=0;i<m;i++)
{
scanf("%d%d",&umb[i][0],&umb[i][1]);
}
dp[0]=0;
for(int i=1;i<=a;i++)
{
if(!(rain[i]==rain[i-1] && rain[i]!=0))
{
dp[i]=min(dp[i],dp[i-1]);
}
for(int j=0;j<m;j++)
{
if(umb[j][0]>=i)
continue;
int pre=umb[j][0];
long long w=umb[j][1];
dp[i]=min(dp[i],dp[pre]+w*(i-pre));
}
}
if(dp[a]==inf)
{
printf("-1\n");
}
else
printf("%lld\n",dp[a]);
}
return 0;
}