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

来源:互联网 发布:java边界布局 编辑:程序博客网 时间:2024/04/27 22:12
#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;  }

阅读全文
4 0
原创粉丝点击