• CF1141E Superhero Battle


    A superhero fights with a monster. The battle consists of rounds, each of which lasts exactly n minutes. After a round ends, the next round starts immediately. This is repeated over and over again.

    Each round has the same scenario. It is described by a sequence of n numbers: d1,d2,,dn(10^6di10^6). The i-th element means that monster's hp (hit points) changes by the value didi during the i-th minute of each round. Formally, if before the i-th minute of a round the monster's hp is h, then after the i-th minute it changes to h:=h+di

    The monster's initial hp is H. It means that before the battle the monster has H hit points. Print the first minute after which the monster dies. The monster dies if its hp is less than or equal to 0. Print -1 if the battle continues infinitely.

    Input

    The first line contains two integers H and n (1H10^121≤n≤2⋅10^5). The second line contains the sequence of integers d1,d2,…,dn (10^6di10^6), where di is the value to change monster's hp in the i-th minute of a round.

    Output

    Print -1 if the superhero can't kill the monster and the battle will last infinitely. Otherwise, print the positive integer k such that k is the first minute after which the monster is dead.

    Examples
    input
    1000 6
    -100 -200 -300 125 77 -4
    
    output
    9
    
    input
    1000000000000 5
    -1 0 0 0 0
    
    output
    4999999999996
    
    input
    10 4
    -3 -6 5 4
    
    output
    -1
    题意解释:输入,给定了怪物的hp和n轮战斗对怪物造成的伤害。输出,怪物的hp降到0及以下即被击败输出第几分钟怪物被击败或-1.
    解题思路:先判断第一个周期造成的最高伤害是多少和第一个周期是否对怪物造成了伤害,来确定怪物是否能被击败。然后我们通过计算求出到打败怪物的前一个周期的时间,再判断最后一个周期何时击败怪物。
    其实可以说是个数学题,这里我用了二分来求解,但是long long精度不够,中间判断的时候将long long转为double来提高精度。
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    ll a[2000005];
    int main()
    {
        ll hp,n;
        scanf("%lld%lld%lld",&hp,&n,&a[1]);
        ll t=a[1];
        ll aa=0;
        ll mmin=min(t,aa);
        ll flag=1;
        for(int i=2;i<=n;++i)
        {
            scanf("%lld",&a[i]);
            t+=a[i];
            if(mmin>t)
            {
                mmin=t;
                flag=i;
            }
        }
        ll tmp=hp;
        tmp+=mmin;
        if(tmp<=0)
        {
            for(int i=1;i<=n;++i)
            {
                hp+=a[i];
                if(hp<=0)
                {
                    cout<<i;
                    return 0;
                }
            }
        }
        else
        {
            if(t>=0)
            {
                cout<<-1;
                return 0;
            }
            ll l=0,r=1000000000000;
            while(l<=r)
            {
                double mid=(l+r)/2;
                if(hp+(mid*t)+mmin<=0)
                {
                    r=mid-1;
                }
                else
                {
                    l=mid+1;
                }
            }
            hp+=l*t;    
            for(int i=1;i<=n;++i)
            {
                hp+=a[i];
                if(hp<=0)
                {
                    cout<<i+l*n;
                    return 0;
                }
            }
        }
    }
    View Code
  • 相关阅读:
    python 多进程-03 进程池
    python 多进程-02 进程间数据共享
    python 多进程-01 基本使用
    python 多线程-02 线程池
    开发者入驻
    小程序组件 scroll-view 下拉加载更多,触底触发事件,容器高度设置
    Array.from在360浏览器和IE浏览器兼容问题
    获取cookie
    背景图左右居中
    uniapp使用uni.setStorageAsync刷新页面数据丢失问题
  • 原文地址:https://www.cnblogs.com/yoududezongzi/p/11524694.html
Copyright © 2020-2023  润新知