1191: 冰法斗神龙
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 199 Solved: 15
Description
强大的冰魔法师zz一路过关闯将,终于独自一人杀到了神龙面前。神龙的血量值为HP,正常状态下每秒进行一次攻击,伤害值为DAMAGE。zz精通n种瞬发冰控魔法(在同一秒内,zz发动的冰魔法要比神龙的攻击快上一点),第i(1<=i<=n)种魔法伤害值为damage[i],并使神龙进入冰冻状态(神龙在冰冻状态下不会进行攻击,且如果神龙在冰冻状态下再次受到冰魔法的攻击,则冰冻时间累加),维持freeze[i]秒,使用完后有cd[i]秒的时间不得使用任何魔法。当zz与神龙有一方的血量值小于等于0时,即判定那一方死亡。zz想杀神龙,但是又怕死,所以请你帮他判断一下以他现有的血量hp和他的技能,能否强杀神龙。
Input
第一行输入整数T代表T组数据,T<=30
输入数据的第一行为2个整数HP(0<HP<10^8) DAMAGE (0<DAMAGE<10^8) 分别代表神龙的血量值和神龙每次的攻击值。
第二行也是2个整数hp(0<hp<10^8),n(1<=n<=1000000) 分别代表zz的血量以及zz会的魔法种类数。
第三行到n+2行每行均为3个整数damage[i](0<=damage<=100),freeze[i](0<=freeze[i]<=100),cd[i](1<=cd[i]<=100),(1<=i<=n)分别代表第i种魔法的伤害值,冰控时间,冷却时间。
Output
输出只有一行YES或NO,分别代表能杀死神龙和不能杀死神龙。
Sample Input
Sample Output
HINT
Source
http://www.gdutcode.sinaapp.com/problem.php?id=1191
考虑到:只可能是一种技能最优,不可能你用着这个技能,然后用另一个,再用回来这个,这样是不可能最优的。但可能是若干次A技能,然后选一次伤害最大的技能来用,最后一次用最大值来冲一冲。
然后有些情况是直接YES的。
1、如果wait[i] - fre[i]等于0,就是能一路压着神龙,而且这个的攻击力不能等于0
2、如果wait[i] - fre[i]小于0,就是能争取自己的时间了,这时也不是直接是YES的,还要看看mx是否大于0
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> #define IOS ios::sync_with_stdio(false) using namespace std; #define inf (0x3f3f3f3f) typedef long long int LL; #include <iostream> #include <sstream> #include <vector> #include <set> #include <map> #include <queue> #include <string> const int maxn = 1000000 + 20; int att[maxn]; int fre[maxn]; int wait[maxn]; void work() { int HP, hurt; int MYHP, m; scanf("%d%d%d%d", &HP, &hurt, &MYHP, &m); int mx = -inf; for (int i = 1; i <= m; ++i) { scanf("%d%d%d", &att[i], &fre[i], &wait[i]); mx = max(mx, att[i]); } int need = MYHP / hurt + ((MYHP % hurt) > 0); for (int i = 1; i <= m; ++i) { int dis = wait[i] - fre[i]; if (dis == 0 && att[i] == 0) continue; if (dis == 0 && att[i] != 0) { printf("YES\n"); return; } if (dis < 0 && mx != 0) { printf("YES\n"); return; } if (dis < 0 && mx == 0) { continue; } int how = need / dis + ((need % dis) > 0); // printf("%d*****\n", how); int cut = (how - 1) * att[i] + mx; if (cut >= HP) { printf("YES\n"); return; } // cout << cut << endl; } printf("NO\n"); return; } int main() { #ifdef local freopen("data.txt","r",stdin); #endif int t; scanf("%d", &t); while (t--) work(); return 0; }
不要看题解了,看这个数据
1
100 1
20 3
49 0 17
50 0 100
1 0 1
我的wa