1191: 冰法斗神龙 暴力枚举

1191: 冰法斗神龙

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 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

2
20 4
10 2
3 1 2
5 0 1
20 3
10 2
3 1 2
5 0 1

Sample Output

NO
YES

HINT

Source

[Submit][Status][Web Board]

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

#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

时间: 2024-08-27 09:18:29

1191: 冰法斗神龙 暴力枚举的相关文章

暴力枚举法总结

集训快要结束了,按照要求需要写一篇关于枚举的总结,于是在网上也看了许多其他菊苣写的文章,深受启发,但是思来想去感觉又不太系统,于是希望能在吸收那些知识后做一些整理,帮助后面的新人. 枚举的基本方法: 枚举,枚举,顾名思义,就是将所有情况都举出,并判断其是否符合题目条件.所以枚举的基本方法便是分析题意后,找到一个合适的维度列举每一个元素,以完成题目.其中如何找到一个合适的维度来进行枚举便是其中的最大难点. 枚举的基本条件: 首先是时间条件.一般来说主流的OJ当中,1000ms的时间限制下可以运行操

Codeforces Round #266 (Div. 2)B(暴力枚举)

很简单的暴力枚举,却卡了我那么长时间,可见我的基本功不够扎实. 两个数相乘等于一个数6*n,那么我枚举其中一个乘数就行了,而且枚举到sqrt(6*n)就行了,这个是暴力法解题中很常用的性质. 这道题找出a和b中最小的那个,然后开始枚举,一直枚举到sqrt(6*n)的向上取整.这样所有可能是答案的情况都有啦.再干别的都是重复的或者肯定不是最小面积的. #include<iostream> #include<cstdio> #include<cstdlib> #includ

HDU 5778 abs (暴力枚举)

abs Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 399    Accepted Submission(s): 140 Problem Description Given a number x, ask positive integer y≥2, that satisfy the following conditions:1.

暴力枚举篇

Q1(uva 725): 给出一个整数n,找到所有的0~9的排列,是的前五个数组成的整数能够整除后五个数组成的整数. 分析:很典型的基本暴力枚举法,暴力求解往往伴随优化.这道题目的优化点在于枚举后五位得到10x9x8x7x6种情况,然后基于这些情况和等式关系,然后得到前面的整数,然后只需判断一下是否满足每个数字只出现了一次即可,由于题目是要求从小到大输出,这里枚举的时候控制一下从小到大枚举即可. 参考代码如下: #include<cstdio> #include<cstring>

hdu5616 暴力枚举

2017-08-25 20:08:54 writer:pprp 题目简述: ? HDU 5616? n个砝码,可以放在天平左右两侧或不放? m次询问,每次询问是否可以测出给定重量? 1 ≤ n ≤ 20? 1 ≤ m ≤ 100 这道题采用枚举的思路的话实现起来还是有点困难的, 要实现的功能是对每个砝码进行处理,加到左边, 加到右边,或者是不加 看了大神的代码,感觉很巧妙, 设置了两个标记数组 vis1[2005], vis2[2005] 一个vis1用来记录当前已经可以实现的重量 另一个vis

hdu4282A very hard mathematic problem 暴力枚举

//给出k //找x,y,z使得x^z+y^z+x*y*z = k //x,y,z都为正整数x<y,z>1问有多少种方法 //当z = 2时,可以看到左边是一个完全平方 //而当z>=3时,可以暴力枚举x,y //由于k<2^31所以x<2^(31/3)枚举复杂度可以过 #include<cstdio> #include<cstring> #include<iostream> #include<cmath> using name

hdu 5247 找连续数【暴力枚举】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5247 分析:这道题是2015百度之星初赛1的2题,当时没看这道题 是队友看的,比完以后也做了一下,思路大体都是一样的,就是 暴力枚举,因为k<=1000,那么我们可以每一点x为起点跑[x,x+999] 这段区间,把每得到一段连续的子区间[x,?],则num[len]++(len=size([x,?])); 这样就可以了,最后num数组里就是对应的答案 献上代码: #include<stdio.h&

HDU 4770 Lights Against Dudely 暴力枚举+dfs

又一发吐血ac,,,再次明白了用函数(代码重用)和思路清晰的重要性. 11779687 2014-10-02 20:57:53 Accepted 4770 0MS 496K 2976 B G++ czy Lights Against Dudely Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1360    Accepted Subm

ZOJ3818-Pretty Poem(暴力枚举)

题目链接 题意:求所给字符串是否符合ABABA或者ABABCAB的形式,如果可以的话输出Yes,不可以的话为No. 思路:暴力枚举A和B的长度,再用从长度减去3倍的AB长度,即为C的长度,看组合而成的字符串是否与给定的相等.在这里string中的substr函数是个好东西. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <a