1141E - Superhero Battle

博客讲述了在解决1141E - Superhero Battle问题时遇到的两个关键错误:1. 错误的条件判断导致逻辑失误;2. 未能正确计算总伤害值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

总体思路明确,但是犯了2个非常低级的错误。。。

1.判断错误条件一开始写的(mn>=0||d[n-1]>=0) 实际条件是mn>=0||(d[n-1]>=0&&H+mn>0
2.d[i]不是原来的伤害,而是从iter*n+0时刻开始到这个时候的一个总伤害值,在最后一次循环的伤害计算时犯错

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define maxn 800000
ll d[maxn];

int main(void){
    ll H,n,ans;
    cin>>H>>n;
    ll mn=maxn;
    d[0]=0;
    for(ll i=0;i<n;i++){
        ll cha;
        cin>>cha;
        if(i==0){
            d[i]=cha;
        }
        else{
            d[i]=d[i-1]+cha;
        }
        mn=min(d[i],mn);
    }
    if(mn>=0||(d[n-1]>=0&&H+mn>0)){
        printf("-1\n");
        return 0;
    }
    if(H>-1*mn){
        ll iter;
        if((H+mn)%(-1*d[n-1])==0){
            iter=(H+mn)/(-1*d[n-1]);
        }
        else{
            iter=(H+mn)/(-1*d[n-1])+1;
        }
        ll h0=H+d[n-1]*iter;
        ll i;
        for(i=0;i<n;i++){
//            printf("i=%d,d[i]=%d\n",i,d[i]);
            if(h0+d[i]<=0){
                i+=1;
                break;
            }
        }
        ans=iter*n+i;
    }
    else{
        ll h0=H;
        ll i;
        for(i=0;i<n;i++){
            h0+=d[i];
            if(h0<=0){
                i+=1;
                break;
            }
        }
        ans=i;
    }
    printf("%lld",ans);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值