在 Warcraft III 之冰封王座中,毀滅者是不死族打三本后期時的一個魔法飛行單位。
毀滅者的核心技能之一,叫做魔法吸收(Absorb Mana):

現在讓我們來考慮下面的問題:
假設你擁有n個魔法單位,他們從左到有站在一行,編號從 1 到n。 每個單位擁有三項屬性:
si: 初始法力。
mi: 最大法力上限。
ri: 每秒中法力回復速度。
現在你操縱一個毀滅者,有m個操作,tlr,表示時刻 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非降。
輸出輸出一行一個整數表示毀滅者一共吸收了多少法力。
50 10 10 12 10 20 10 12 10 10 125 1 519 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 }
運行效果:

新聞熱點
疑難解答