Educational Codeforces Round 96 (Rated for Div. 2) F. Realistic Gameplay

题目链接

思路:
dp: d p i dp_i dpi 表示第i波怪物来之前至少要准备的子弹数量。
在第i波怪物来之前,最多有k发子弹,在 l i , r i l_i,r_i li,ri期间最多能换 k ( r i − l i ) k ( r_i-l_i) k(rili)的子弹。
我们倒着枚举每波怪兽,第i波至少需要 a i a_i ai子弹,如果第i波怪物和第i+1波怪物连在一起,那么还需要额外的 d p i + 1 dp_{i+1} dpi+1子弹来使得第i+1波怪物也能全打完。
中间判一下-1的情况。
如果有解的话:
最后在算的时候正着枚举,初始有k发子弹,如果当前子弹数量不够那么肯定要把当前剩余子弹都扔了,然后装弹。然后打出去 a i a_i ai发子弹把第i波怪兽杀完。

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2e5 + 10;
#define fi first
#define se second
#define pb push_back
#define wzh(x) cerr<<#x<<'='<<x<<endl;
int n,k,l[N],r[N],a[N];
LL dp[N];//表示第i波怪物来之前至少要准备dp_i的子弹
int main() {
  ios::sync_with_stdio(false);
  cin>>n>>k;
  for(int i=1;i<=n;i++)cin>>l[i]>>r[i]>>a[i];
  for(int i=n;i>=1;i--){
    LL need=a[i];
    if(r[i]==l[i+1])need+=dp[i+1];
    if(1ll*(r[i]-l[i]+1)*k<need)return cout<<-1,0;
    dp[i]=max(0ll,need-1ll*(r[i]-l[i])*k);
  }
  int res=k;
  LL ans=0;
  for(int i=1;i<=n;i++){
    if(res<dp[i]){
      ans+=res;
      res=k;
    }
    ans+=a[i];
    res=((res-a[i])%k+k)%k;
  }
  cout<<ans<<'\n';
  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值