码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces 1141E Superhero Battle

时间:2019-07-22 09:52:40      阅读:86      评论:0      收藏:0      [点我收藏+]

标签:ace   sum   位置   name   mat   names   bit   std   题目   

  • 题目大意: 给出长度为\(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

标签:ace   sum   位置   name   mat   names   bit   std   题目   

原文地址:https://www.cnblogs.com/xxrlz/p/11223780.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!