HDU4970-Killing Monsters

来源:互联网 发布:女 欧 t恤 知乎 编辑:程序博客网 时间:2024/06/01 12:08

题目链接


题意:塔防游戏,长为n的一条路上建造m个箭塔,每个箭塔攻击范围为[l, r],每格造成伤害为d,再给出k只怪兽的血量h,出现位置x,怪兽向前走,问最后还有几只怪兽存活。

思路:先求出每个格子造成的伤害,开一个stack数组,stack[l] += d,stack[r + 1] -= d,然后从前往后扫描一次,这样就可以得到每个格子造成的伤害;然后求出第1格到第i格造成的伤害,做法同上,之后就可以判断哪些怪兽是活着的了。

代码:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;typedef __int64 ll;const int MAXN = 100005;ll sum[MAXN], stack[MAXN], hurt[MAXN];int L[MAXN], R[MAXN], d[MAXN];int n;int main() {    while (scanf("%d", &n) && n) {        memset(stack, 0, sizeof(stack));        memset(sum, 0, sizeof(sum));        memset(hurt, 0, sizeof(hurt));        int a;        scanf("%d", &a);        for (int i = 1; i <= a; i++) {            scanf("%d%d%d", &L[i], &R[i], &d[i]);            stack[L[i]] += d[i];            stack[R[i] + 1] -= d[i];        }        for (int i = 1; i <= n; i++) {            sum[i] = sum[i - 1] + stack[i];          }//每格的伤害        for (int i = 1; i <= n; i++) {            hurt[i] = hurt[i - 1] + sum[i];         }//从第1格到第i格的伤害        ll h;         int ans = 0, x, b;        scanf("%d", &b);        for (int i = 0; i < b; i++) {            scanf("%I64d%d", &h, &x);            if (hurt[n] - hurt[x - 1] < h)                 ans++;        }         printf("%d\n", ans);    }       return 0;}


0 0
原创粉丝点击