hdu 6082 2017百度之星资格赛

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<map>
using namespace std;
long long  n,m;
long long a[200005],b[200005];
long long k[20050],p[20050];
long long d[5005][21];

void dp()
{
    memset(d,0x7f,sizeof(d));
    for(int i=0;i<=10;i++) d[0][i]=0;
    for(int s=0;s<=10;s++)
    {
        for(int i=1;i<=2001;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(p[j]<=s)continue;//no damage
                if(i-(p[j]-s)<0)
                    d[i][s]=min(d[i][s],k[j]);
                else
                    d[i][s]=min(d[i][s],d[i-p[j]+s][s]+k[j]);
            }
        }
    }

}
int  main()
{
    //freopen("in.txt","r",stdin);
    while(~scanf("%lld %lld",&n,&m))
    {
        for(int i=0;i<n;i++)
        {
            scanf("%lld %lld",a+i,b+i);

        }
        for(int i=0;i<m;i++) scanf("%lld %lld",k+i,p+i);
        long long  res=0;bool flag=true;
        dp();
        long long f=0x7fffffffffffffff;
        for(int j=0;j<=10;j++)
        {
            f=0x7fffffffffffffff;
            for(int i=2001;i>=0;i--)
            {
                f=min(f,d[i][j]);
                d[i][j]=f;
            }
        }
        for(int i=0;i<n;i++)
        {
            long long  r=d[a[i]][b[i]];

            if(r>=0x7f7f7f7f7f7f7f7e)
            {
                flag=false;
                break;
            }
            res+=r;
        }
        if(!flag)
            printf("-1
");
        else
            printf("%lld
",res);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/z1141000271/p/7300218.html