您的位置:首页 > 编程语言 > C语言/C++

2017百度之星资格赛 1003 度度熊与邪恶大魔王

2017-08-05 18:46 337 查看
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;

ll a[120000],b[120000];
ll k[1200],p[1200];
ll dp[1200][22];
int main()
{
int n,m;
while(cin>>n>>m)
{
for(int i=0;i<n;i++)
scanf("%d%d",&a[i],&b[i]);

ll maxp=0;
for(int i=0;i<m;i++)
{
scanf("%d%d",&k[i],&p[i]);
maxp=max(maxp,p[i]);
}
int flag=0;
for(int i=0;i<n;i++)
{
if(b[i]>=maxp){
flag=1;
break;
}
}
if(flag){
puts("-1");
continue;
}
memset(dp,INF,sizeof(dp));
for(int j=0;j<=12;j++)
dp[0][j]=0;
for(int x=0;x<m;x++)
{
for(int j=0;j<=10;j++)
for(int i=0;i<=1000;i++)
{
if(p[x]<=j)continue;
if(i<=p[x]-j)
dp[i][j]=min(dp[i][j],k[x]);
else if(dp[i][j]>dp[i-(p[x]-j)][j]+k[x])
dp[i][j]=dp[i-(p[x]-j)][j]+k[x];
}
}
ll sum=0;
for(int i=0;i<n;i++)
{
sum+=dp[a[i]][b[i]];
}
cout<<sum<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息