HDOJ 6082 度度熊与邪恶大魔王
程序员文章站
2023-12-27 09:37:27
...
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6082
百度之星2017资格赛的第三题。
自从从集训队退出之后,就再也没有做过题目了,当天晚上突然看到短信才想起还参加了这个比赛,当时正在看守望世界杯(堕落的暑假),有点心急,尤其是当时点开第一题看了一下,满脑子都是这TMD能做,未免有点心烦,心想反正做一题就可以了,于是马上打开了过题人数最多的一题,也就是这题。
这题思路和题意都很简单,每个技能都有晶石消耗和攻击力,每个怪都有HP和防御力,怎么才能在晶石消耗最小的情况下打掉所有的怪。思路也是很容易的DP解决,区别就是因为每个怪的防御力不同所以要做n次DP。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const LL INF = 1e18;
const int maxn = 2005;
const int maxm = 1e5 + 100;
inline LL input()
{
LL res = 0, ch, flag = 0;
if((ch=getchar())=='-') {
flag = 1;
}
else if(ch>='0' && ch<='9') {
res=ch-'0';
}
while((ch=getchar())>='0'&&ch<='9') {
res = res*10+ch-'0';
}
return flag? -res : res;
}
LL dp[maxn][15];
LL a[maxm],b[maxm],k[maxn],p[maxn];
int main()
{
int n,m;
while(scanf("%d%d", &n, &m) !=EOF)
{
for(int i=0; i<n; i++)
{
a[i] = input();
b[i] = input();
}
for(int i=0; i<m; i++)
{
k[i] = input();
p[i] = input();
}
for(int i=0; i<maxn; i++) {
for(int j=0; j<=10; j++) {
dp[i][j] = INF;
}
}
for(int i=0; i<=10; i++)
{
dp[0][i] = 0;
for(int j=0; j<m; j++)
{
LL tmp = p[j]-i;
if(tmp <= 0) continue;
for(int x=tmp; x<=2003; x++)
{
dp[x][i]=min(dp[x - tmp][i] + k[j], dp[x][i]);
}
}
for(int j=2002; j>=0; j--)
{
dp[j][i] = min(dp[j][i], dp[j+1][i]);
}
}
LL ans=0;
for(int i=0; i<n; i++) {
ans += dp[a[i]][b[i]];
}
if(ans >= INF) {
printf("-1\n");
}
else cout << ans << endl;
}
}