首页 > 代码库 > 毁灭者问题

毁灭者问题

 毁灭者问题

时间限制: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 非降。

 

输出

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

样例输入
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 }

运行效果:

技术分享

 

毁灭者问题