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

xiaoxiao2021-02-28  79

#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; }
转载请注明原文地址: https://www.6miu.com/read-32879.html

最新回复(0)