小明学习编程后打算设计一个游戏给毛豆试玩。
毛豆初始生命值为 n,威胁度为 0。有 m 位敌人,第 i 位敌人的战斗力为 a i ,胆量为 b i 。
毛豆玩了 T 轮游戏,每次会挑选一个位置 k,然后从第 k 个敌人开始,往后一个个对敌人尝试发起战斗:
如果当前敌人的胆量小于等于 毛豆的威胁度,则会被 毛豆吓坏直接逃跑不战斗,否则就会开始战斗。 假设当前与第 i 为敌人进行了战斗,战斗后 毛豆的生命值就会减少 a i ,然后威胁度会变为 b i 。 如果生命值小于等于 0,那么 毛豆被视为被打败了,这轮游戏就结束了。 和第 m 位敌人战斗后,就没有敌人了,游戏也就自然结束了。 每轮游戏开始时 毛豆的生命值都会恢复如初,威胁度会重新归 0。所有被吓跑的敌人也都会回来。请你输出每轮游戏 毛豆最后被谁打败了,如果游戏结束时 毛豆没有被打败,输出 0。
第一行为三个数 n,m,T。
接下来m 行都有a i 和b i 。
接下来 T 行,第 i 行为第 i 轮游戏的开始位置 k。
输出 T 行,即每轮游戏 毛豆最后被谁打败了,如果没有被打败过输出 0。
用例输入 1
25 6 1
10 4
8 6
5 3
14 4
9 10
20 4
1
用例输出 1
5
用例输入 2
19 6 6
10 4
8 6
5 3
14 4
9 10
20 4
1
2
3
4
5
6
用例输出 2
5
0
4
5
0
6
只进行了一次游戏,从第一个敌人开始,毛豆的初始生命值 25,威胁度0
| 敌人战斗力 | 敌人胆量 | 是否战斗 | 战后生命值 | 战后威胁度 |
|---|---|---|---|---|
| 10 | 4 | 胆量大于 0,开始战斗 | 14 | 4 |
| 8 | 6 | 胆量大于 4,开始战斗 | 7 | 6 |
| 5 | 3 | 胆量小于 6,被吓跑 | 不变 | 不变 |
| 14 | 4 | 胆量小于 6,又被吓跑 | 不变 | 不变 |
| 9 | 10 | 胆量大于 6,开始 | -2 | - |
| 20 | 4 | 游戏已经结束 | 游戏已经结束 | 游戏已经结束 |
| 因此游戏最后一次战斗是和第5位敌人。 |
和样例 1 敌人一样,初始血量不同,从每个敌人都开始打一次。
对于 100 的数据:
1≤n≤109 ,初始血量 1≤m,T≤105 ,敌人数量,游戏轮数 1≤ai≤1000,敌人战斗力 1≤bi≤109 ,敌人胆量 1≤k≤,游戏开始的位置
#include<bits/stdc++.h>
#pragma GCC optimize(3,"Ofast","inline")
using namespace std;
int n, m, T, wei;
int t;
int ab[100005][3];
int main() {
freopen("game.in", "r", stdin);
freopen("game.out", "w", stdout);
scanf("%d%d%d", &n, &m, &T);
int n_mirror, wei_mirror;
n_mirror = n;
wei_mirror = wei;
for(int i = 1; i <= m; i++) {
cin >>ab[i][1] >>ab[i][2];
}
for(int i = 1; i <= T; i++) {
cin >>t;
bool flag = true;
for(int j = t; j <= m; j++) {
if(ab[j][2] <= wei) {
continue;
}
else {
n = n - ab[j][1];
wei = ab[j][2];
if(n <= 0) {
cout <<j <<endl;
flag = false;
break;
}
}
}
if(flag) {
cout <<"0" <<endl;
}
n = n_mirror;
wei = wei_mirror;
}
fclose(stdin);
fclose(stdout);
return 0;
}