如何优化运行速度

chdaxia chdaxia 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
是一道算法题,但是显示结果超时,不知道有什么更好的办法可以优化。
运行时间是18000ms需要优化到10000ms,我看了题库里基本都是C实现的没有java,不知道如何用java写出高速的算法
题目是:
假设你拥有 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 非降。



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









我的代码如下:
import java.util.Scanner;

public class Main {

public class Magician {
public int mana;
public int maxMana;
public int regenerateNum;
public int timeT;

Magician(int mana, int maxMana, int regenerateNum) {
this.mana = mana;
this.maxMana = maxMana;
this.regenerateNum = regenerateNum;
timeT = 0;
}

public int absorbMana(int currentTime) {
int result = 0;
result = mana + (currentTime - timeT) * regenerateNum < maxMana ? mana
+ (currentTime - timeT) * regenerateNum
: maxMana;
// System.out.println(result);
timeT = currentTime;
mana = 0;
return result;
}

}

public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int numOfMagician = sc.nextInt();
Magician magicianList[] = new Magician[numOfMagician];

int sj, mj, rj;
Main test = new Main();
for (int i = 0; i < numOfMagician; i++) {
sj = sc.nextInt();
mj = sc.nextInt();
rj = sc.nextInt();
magicianList[i] = test.new Magician(sj, mj, rj);
}

int numOfOperation = sc.nextInt();
int ti, li, ri;
int result = 0;
for (int i = 0; i < numOfOperation; i++) {
ti = sc.nextInt();
li = sc.nextInt() - 1;
ri = sc.nextInt() - 1;
while (li <= ri) {
result += magicianList[li].absorbMana(ti);
li++;
// System.out.println("absorb "+li+"result is "+result);
}
}

System.out.println(result);

}
}


...全文

相关推荐

评论
收藏 已收藏
分享
返回顶部
chdaxia
Java 51,407 成员 86,127 内容