度度熊与邪恶大魔王
Accepts: 1288
Submissions: 7716
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 32768/32768 K (Java/Others)
每个人的防御只有0-10这11种可能,暴力这11种防御
然后完全背包就好,只要注意血量是可以溢出的
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define LL long long
using namespace std;
LL a[1005][12], cost[1005], dp[1005];
int main(void)
{
LL n, m, i, j, k, x, y, ans, hurt, ok;
while(scanf("%I64d%I64d", &n, &m)!=EOF)
{
memset(a, 0, sizeof(a));
memset(cost, 12, sizeof(cost));
for(i=1;i<=n;i++)
{
scanf("%I64d%I64d", &x, &y);
a[x][y]++;
}
for(i=1;i<=m;i++)
{
scanf("%I64d%I64d", &x, &y);
cost[y] = min(cost[y], x);
}
ans = 0, ok = 1;
for(i=0;i<=10;i++)
{
memset(dp, 12, sizeof(dp));
for(j=i+1;j<=1000;j++)
{
if(cost[j]>1000000)
continue;
hurt = j-i;
dp[0] = 0;
for(k=1;k<=1000;k++)
dp[k] = min(dp[max(k-hurt, 0ll)]+cost[j], dp[k]);
}
for(j=1;j<=1000;j++)
{
if(a[j][i]==0)
continue;
ans += dp[j]*a[j][i];
if(dp[j]>100000000)
ok = 0;
}
if(ok==0)
break;
}
if(ok==0)
printf("-1\n");
else
printf("%I64d\n", ans);
}
return 0;
}
本题通过算法解决度度熊如何用最少的晶石消灭不同生命值和防御力的怪兽。需要处理多组测试数据,涉及完全背包问题,并考虑攻击效果及技能消耗。
9万+

被折叠的 条评论
为什么被折叠?



