Codeforces 1141E Superhero Battle

Posted 新新人類

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 1141E Superhero Battle相关的知识,希望对你有一定的参考价值。

  • 题目大意: 给出长度为\(n\)的序列\(d_i\)和生命值\(H\),每次到达该位置后生命值更新为\(H+d_i\),求\(H\)首次为零的时段
  • 思路: 首先想到先跑\(\ | \frac{H}{\sum{d_i}}\ | -1\)次然后跑最后一轮,但是序列的最小前缀可能远远小于\(\sum{d_i}\),所以跑\(\ | \frac{H}{\sum{d_i}}\ | - \frac{minsum}{\sum{d_i}}\)次,然后暴力跑到\(H\)为0即可
#include<bits/stdc++.h>
 
#define ll long long 
#define FOR(i,n) for(int i =1; i <= n;++i ) 
#define FOR0(i,n) for(int i =0; i < n;++i )  
#define inf 0x3f3f3f3f
using namespace std;
 
const int maxn = 2*1e6+10;
 
ll H;
int n;
int a[maxn];
 
int main(){
    cin >>H >> n;
    ll tot = 0;
    ll mps = 0;
    ll HH = H;
    FOR(i,n){
        cin >> a[i];
        tot += a[i];
        HH+= a[i];
        mps = min(mps,tot);
        a[i+n] = a[i];
        if(HH<=0){
            cout <<i  << endl;
            exit(0);
        }
    }
    if(tot >=0){
        cout << -1 << endl;
    }else{
        ll len = H/(-1*tot);
        len = max(len-mps/tot,0LL);
        H+=len*tot;
        len *= n;
        while(H>0){
            FOR(i,n+n){
                H+= a[i];
               if(H<=0){
                   len += i;
                    break;
                }
            }
            if(H>0)
                len += n+n;
        }
        cout << len<<endl;
    }
 
    return 0;
}

被卡了两次,贪心也不能贪过头了

以上是关于Codeforces 1141E Superhero Battle的主要内容,如果未能解决你的问题,请参考以下文章

如何看codeforces做了多少题

codeforces上怎么看测试数据

codeforces比赛后怎么看题解和答案

codeforces是啥?

codeforces Codeforces 650A Watchmen

CodeForces - 504A && CodeForces - 624C && CodeForces - 2B