2018 ICPC EC-final i题Misunderstood Missing

题意:A代表你的初始攻击力,D代表你每回合递增攻击力,A,D初始为0。

第一行给一个t,代表t组测试数据

给你N个回合(n<=100),第i个回合有3个数字a[i],b[i],c[i](范围均1e9),代表有三种选择,1.攻击,造成A+a[i]的伤害

2.使D增加b[i]

3.使A增加c[i]

问,经过N回合后最多可以造成多少伤害

 

样例如下。。


 

 

一眼看出是个DP,但是不好推。一开始在想DP存什么,怎么开数组,因为当前造成的伤害,A,D的数量级都是1e9.又不能贪心证明当前的三种选择哪一种最优。想了一个小时快自闭才发现倒推。。实属DD。

想出倒推之后转化题意,倒推的过程中是不知道现在的A和D是多少的。那么我只用管造成的伤害就行了。设当前回合为第i回合。如果选择攻击,那么造成伤害+a[i],假设当前回合选择使A增加c[i],那么在第i-n的回合中每一次进攻造成的伤害就会增加c[i],倒推过程中,假设之前进攻了k次,并且当前回合选择了把A增加c[i],那么伤害就会增加k*c[i]。同理,如果当前回合选择使D增加b[i],那么如果在第q个回合攻击,伤害就会增加(q-i)*b[i],这是进攻一次的情况。那么如果这个回合之后进攻了k次,那么每次伤害会增加(q1+q2+...+qk  - k*i )*b[i],令之前那些q的总和为j,那么伤害就会增加(j-i*k)*b[i]。这里的j指“倒推过程中,之前进攻的回合数之和”。

 

#include <bits/stdc++.h>
using namespace std;
#def
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值