hihocoder 题库#1034

#1034 : 毁灭者问题

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

在 Warcraft III 之冰封王座中,毁灭者是不死族打三本后期时的一个魔法飞行单位。

毁灭者的核心技能之一,叫做魔法吸收(Absorb Mana):

14054064004625.png

现在让我们来考虑下面的问题:

假设你拥有 n 个魔法单位,他们从左到有站在一行,编号从 1 到 n。 每个单位拥有三项属性:

 

  • si: 初始法力。

  • mi: 最大法力上限。

  • ri: 每秒中法力回复速度。

 

现在你操纵一个毁灭者,有 m 个操作,t l r,表示时刻 t,毁灭者对所有编号从 l 到 r 的单位,使用了魔法吸收。操作按照时间顺序给出,计算毁灭者一共吸收了多少法力。

 

输入

输入数据的第一行有一个整数 n(1 ≤  n ≤105) — 你的魔法单位的数目。

接下来的 n 行,每行有三个整数 si, mi, ri(0 ≤ si ≤ mi ≤ 105, 0 ≤ ri ≤ 105) 描述一个魔法单位。

接下来一行又一个整数 m(1 ≤ m ≤ 105), — 操作的数目。

接下来的 m 行,每行描述一个操作 t, l, r(0 ≤ t ≤ 109, 1 ≤ l ≤ r ≤ n),t 非降。

 

输出

输出一行一个整数表示毁灭者一共吸收了多少法力。

样例输入
5
0 10 1
0 12 1
0 20 1
0 12 1
0 10 1
2
5 1 5
19 1 5
样例输出
83


我的解答 ,但时间超过限制,求帮助
#include <iostream>
#include <vector>
using namespace std;

class zunit
{
private:
    int znow, m, r;
public:
    zunit(int a, int b, int c) { znow = a;m = b;r = c; };
    int attack()
    {
        int temp = znow;
        znow = 0;
        return temp;
    }
    void increase(int ztime)
    {
        znow = znow + ztime*r;
        if (znow > m)
            znow = m;
    }
};

int main()
{
    int n;
    cin >> n;
    vector<zunit> zpoint;
    for (int i = 0;i < n;i++)
    {
        int a, b, c;
        cin >> a >> b >> c;
        zpoint.push_back(*(new zunit(a, b, c)));
    }
    int m, attackval = 0;
    cin >> m;
    for (int i = 0;i < m;i++)
    {
        int a[100000], b, c;
        a[0] = 0;
        cin >> a[i + 1] >> b >> c;
        for (vector<zunit>::iterator j = zpoint.begin();j != zpoint.end();j++)
        {
            j->increase(a[i + 1] - a[i]);
        }
        for (vector<zunit>::iterator j = zpoint.begin() + b - 1;j != zpoint.begin() + c;j++)
        {
            attackval += j->attack();
        }
    }
    cout << attackval << endl;
    return 0;
}

 



 

转载于:https://www.cnblogs.com/CambridgeLv/p/5359219.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值