度度熊与邪恶大魔王
Accepts: 2481
Submissions: 15467
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 32768/32768 K (Java/Others)
具体见代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 100005
typedef long long ll;
const ll INF=1e18+7;
ll dp[1005][11];
ll a[N], b[N], k[1005], p[1005];
int main(){
int n, m;
ll mxa, mxb, mxp;
while(~scanf("%d%d", &n, &m)){
mxa = mxb = mxp = 0;
for(int i = 0; i < n; i ++){
scanf("%I64d%I64d", &a[i], &b[i]);
mxa = max(mxa, a[i]);
mxb = max(b[i], mxb);
}
for(int i = 0; i < m; i++){
scanf("%I64d%I64d", &k[i], &p[i]);
mxp = max(mxp, p[i]);
}
if(mxb >= mxp){
puts("-1");
continue;
}
for(int i = 0; i <= 10; i++){
for(int j = 0; j <= mxa; j++)
dp[j][i] = INF;
}
for(int i = 0; i <= 10; i++){//防御
dp[0][i] = 0;
for(int v = 0; v < mxa; v++){
for(int j = 0; j < m; j++){
if(p[j] <= i)continue;
ll z = p[j] - i;
if(v+z <= mxa)
dp[v+z][i]=min(dp[v][i]+k[j],dp[v+z][i]);
else
dp[mxa][i]=min(dp[v][i]+k[j],dp[mxa][i]);
}
}
}
ll ans = 0;
for(int i = 0; i <= 10; i++){
for(int j = mxa-1; j>0; j--){
for(int v = j; v <= mxa; v++)
dp[j][i] = min(dp[v][i], dp[j][i]);
}
}
for(int i = 0; i < n; i++)
ans += dp[a[i]][b[i]];
printf("%I64d\n", ans);
}
return 0;
}