毁灭者问题

 毁灭者问题

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

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

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

14054064004625.png

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

假设你拥有 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 }

运行效果:

 

转载于:https://www.cnblogs.com/udld/p/4192326.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值