毁灭者问题
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
在 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 非降。
输出
输出一行一个整数表示毁灭者一共吸收了多少法力。
-
样例输入
-
5 0 10 1 0 12 1 0 20 1 0 12 1 0 10 1 2 5 1 5 19 1 5
代码:1 import java.util.Scanner; 2 3 4 public class Destroyer { 5 6 7 8 public static void main(String argv[]){ 9 10 Scanner br=new Scanner(System.in); 11 // 获取魔法单位数据 12 int n=Integer.parseInt(br.nextLine()); 13 int energy=0; 14 String[] N=new String[n]; 15 for(int i=0;i<n;i++){ 16 17 N[i]=br.nextLine(); 18 19 } 20 21 //获取操作组 22 int m=Integer.parseInt(br.nextLine()); 23 String[] M=new String[m]; 24 for(int i=0;i<m;i++){ 25 26 M[i]=br.nextLine(); 27 28 } 29 br.close(); 30 31 //数据转化为魔法单位对象组 32 Mor[] Mer=new Mor[n]; 33 for(int i=0;i<n;i++){ 34 String[] List=N[i].split(" "); 35 Mer[i]=new Mor(Integer.parseInt(List[0]),Integer.parseInt(List[1]),Integer.parseInt(List[2])); 36 //System.out.println(Mer[i].s+Mer[i].speed+Mer[i].max); 37 } 38 39 //数据转化为操作对象组 40 Mov[] Mver=new Mov[m]; 41 for(int i=0;i<m;i++){ 42 String[] List_v=M[i].split(" "); 43 Mver[i]=new Mov(Integer.parseInt(List_v[0]),Integer.parseInt(List_v[1]),Integer.parseInt(List_v[2])); 44 //System.out.println(Mver[i].time+Mver[i].first+Mver[i].end); 45 } 46 47 //时间修为时间段 48 for(int i=m-1; i>=1;i--){ 49 50 Mver[i].time=Mver[i].time-Mver[i-1].time; 51 52 } 53 54 //计算吸取魔法 55 for (int i=0;i<m;i++){ 56 //计算每个操作的吸取魔法数 57 for(int j=0;j<n;j++){ 58 Mer[j].s=Mer[j].s+Mer[j].speed*Mver[i].time; 59 if(Mer[j].s>=Mer[j].max) 60 Mer[j].s=Mer[j].max; //魔法数不可超过最大值 61 if(j+1<=Mver[i].end && j+1>=Mver[i].first){ 62 energy=energy+Mer[j].s; //魔法被吸取干净 63 Mer[j].s=0; 64 //System.out.println(energy); 65 } 66 67 } 68 } 69 System.out.println(energy); //输出吸取的魔法值 70 71 } 72 73 } 74 75 //定义魔法单位对象 76 class Mor{ 77 78 int s; 79 int speed; 80 int max; 81 Mor(int a,int b,int c){ 82 this.s=a; 83 this.speed=c; 84 this.max=b; 85 } 86 } 87 //定义操作对象 88 class Mov{ 89 90 int time; 91 int first; 92 int end; 93 Mov(int a,int b,int c){ 94 this.time=a; 95 this.first=b; 96 this.end=c; 97 } 98 }
运行效果: