毁灭者问题C++

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

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

在这里插入图片描述

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

假设你拥有 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 非降。

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

#include<iostream>
using namespace std;

class Magic_Unit
{
private:
	int m_s;//当前法力
	int m_m;//最大法力上限
	int m_r;//每秒中法力回复速度
	static int Destroyer_Magic;//毁灭者魔法值
	static int Time;//时间
public:
	Magic_Unit() :m_s(0), m_m(0), m_r(0)
	{	}
	void Init(int s, int m, int r)
	{
		m_s = s;
		m_m = m;
		m_r = r;
	}
	void Mana_Growth(int time);//计算当前魔法单位time时刻的法力值
	void Absorb_Mana();//对当前魔法单位进行魔法吸收
	static void Update_Time(int time)//更新时间
	{
		Time = time;
	}
	static int Return_Destroyer()
	{
		return Destroyer_Magic;
	}
};
int Magic_Unit::Destroyer_Magic = 0;
int Magic_Unit::Time = 0;
void Magic_Unit::Mana_Growth(int time)
{
	int temp_Mana = m_r * (time - Time);
	m_s += temp_Mana;
	if (m_s > m_m)
		m_s = m_m;
}
void Magic_Unit::Absorb_Mana()
{
	Destroyer_Magic += this->m_s;
	this->m_s = 0;
}
int main()
{
	int n = 0, si = 0, mi = 0, ri = 0, m = 0, t = 0, l = 0, r = 0;
	cin >> n;//输入魔法单位的数目
	Magic_Unit* M = new Magic_Unit[n];
	for (int i = 0;i < n;i++)
	{
		cin >> si >> mi >> ri;//依次输入初始法力、最大法力上限、每秒中法力回复速度
		M[i].Init(si, mi, ri);
	}
	cin >> m;//输入操作数
	for (int i = 0;i < m;i++)
	{
		cin >> t >> l >> r;//表示时刻 t,毁灭者对所有编号从 l 到 r 的单位
		for (int j = 0;j < n;j++)
		{
			M[j].Mana_Growth(t);
			if (j >= l - 1 && j < r)
				M[j].Absorb_Mana();
		}
		Magic_Unit::Update_Time(t);
	}
	cout << Magic_Unit::Return_Destroyer() << endl;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值