题意:敌人的防御塔有一定是生命值l,我方有一个工厂,可以制造n种战船来攻击防御塔,但每秒内只能有一只战船正在被建造,给出每种战船需要的建造时间t和它们建好后每秒可以造成的防御塔生命值减少量ll,求我方最少在第几秒可以摧毁防御塔(生命值为<=0)。
思路:容易想到对于每一秒如果选择建造某种战船,需要比较不建造和建造时 t 时间后的对防御塔攻击的总量(即ans[j + t]),但比较难想到建造时 t 时间后的攻击总量为 ans[j] + j * ll,状态转移方程为:ans[j + t] = max(a[j + t], a[j] +j * ll)
应该这样理解,在这一秒选择建造某战船,其实是要考虑在这一秒之前建造了该战船,得到的 t 时间后攻击总量为 :1)一开始的 t 时间建造该战船,那么在之后的 j 时间里得到攻击量 j * ll, 为建造该战船造成的攻击量;2)之后的 j 时间里,不由建造该战船造成的攻击量与在这一秒之前不建造该战船的最大总攻击量相同。额,不知道怎么说。
#include
#include
int main()
{
#ifdef LOCAL
freopen("data.in", "r", stdin);
#endif
int n, l, t, ll, ans[400], cur, min;
while(scanf("%d%d", &n, &l) != EOF)
{
min = 375;//所需最长时间约330+20
memset(ans, 0, sizeof(ans));
for(int i = 0; i < n; i++)
{
scanf("%d%d", &t, &ll);
for(int j = 1; j <= min; j++)
{//读入数据同时处理数据
cur = ans[j] + j * ll;//前j秒内建造该战船在t时间后造成的总攻击量
if(cur > ans[j + t])
{
ans[j + t] = cur;
if(cur >= l && j + t < min)
min = j + t;
}
}
}
printf("%d\n", min);
}
return 0;
}