题目链接

题意

  你受到一群外星人的攻击,第 $i$ 个外星人会在 $ai$ 时间出现,与你的距离为 $di$,且必须在 $bi$ 时间前消灭。你有一个区域冲击波器,每次攻击可以设定一个功率 $R$,这次攻击内会消灭所有距离 $R$ 内的所有外星人,并消耗 $R$ 单位的燃料电池。求消灭所有外星人所需的最少单位的燃料电池。

分析

  由于我们可以先求出小区间内的最小花费,再合并成大区间,这是一个区间DP

  设 $f[i][j]$ 表示消灭时间范围为区间 $[i,j]$ 内所有敌人(出现时间和消灭时间均在区间内),如果区间内不存在敌人,那么该值为 $0$

  那么问题就来了,我们应该怎样枚举区间内的断点

  我们需要先找出区间内距离最远的敌人,这样就能保证得到的花费是最优的,然后我们要将两个不包含该敌人的区间合并,所以断点应该从该敌人的出现时间枚举到消灭时间

  于是可以得到状态转移方程( $x$ 为区间内距离最远的敌人) $$f[i][j]=min(f[i][j],f[i][k]+d[x]+f[k+1][j])$$

  还有因为时间的范围比较大,开二维数组会MLE,所以要把时间点离散化

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 305 int T, n;
int a[N], b[N], d[N], f[ * N][ * N];
int q[ * N], qn; int main() {
scanf("%d", &T);
while (T--) {
qn = ;
scanf("%d", &n);
for (int i = ; i <= n; i++) {
scanf("%d%d%d", a + i, b + i, d + i);
q[++qn] = a[i]; q[++qn] = b[i];
}
sort(q + , q + qn + );
qn = unique(q + , q + qn + ) - q - ;
for (int i = ; i <= n; i++) {
a[i] = lower_bound(q + , q + qn + , a[i]) - q;
b[i] = lower_bound(q + , q + qn + , b[i]) - q;
}
memset(f, 0x3f, sizeof f);
for (int l = ; l <= qn; l++)
for (int i = ; i + l - <= qn; i++) {
int j = i + l - , x = ;
for (int k = ; k <= n; k++)
if (i <= a[k] && b[k] <= j && d[k] > d[x]) x = k;
if (!x) {f[i][j] = ; continue;}
for (int k = a[x]; k <= b[x]; k++)
f[i][j] = min(f[i][j], f[i][k - ] + d[x] + f[k + ][j]);
}
printf("%d\n", f[][qn]);
} return ;
}

[CERC2014] Outer space invaders的更多相关文章

  1. BZOJ3928 [Cerc2014] Outer space invaders

    第一眼,我勒个去...然后看到n ≤ 300的时候就2333了 首先把时间离散化,则对于一个时间的区间,可以知道中间最大的那个一定要被选出来,然后把区间分成左右两份 于是区间DP就好了,注意用左开右开 ...

  2. BZOJ.3928.[CERC2014]Outer space invaders(区间DP)

    BZOJ3928 双倍经验BZOJ4048 Codeforces GYM100543 L \(Description\) \(Solution\) 考虑出现时间在\([l,r]\)内的敌人,设最远的敌 ...

  3. 2018.10.25 bzoj3928: [Cerc2014] Outer space invaders(区间dp)

    传送门 区间dpdpdp好题. 首先肯定需要把坐标离散化. 然后在数轴上面区间dpdpdp. 对于当前区间,区间中最大的数一定会被选. 于是我们记f[i,j]f[i,j]f[i,j]表示所有左端点在i ...

  4. bzoj 3928: [Cerc2014] Outer space invaders

    $f[i][j]$表示消灭起始时间在$(i,j)$内的外星人所花费的最小代价. 考虑在这个区间内距离最远的外星人h,在他的区间中一定要选一个点要开一炮,而且这一炮可以顺便把其他跨过这个点的敌人消灭,剩 ...

  5. [BZOJ3928/4048]Outer space invaders

    [BZOJ3928/4048]Outer space invaders 题目大意: 有\(n(n\le300)\)个物品,第\(i\)个物品会在\(a_i\sim b_i\)时刻出现,且离你的距离为\ ...

  6. Codeforces Gym100543L Outer space invaders 区间dp 动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF-Gym100543L.html 题目传送门 - CF-Gym100543L 题意 $T$ 组数据. 有 $n ...

  7. Codeforces Gym100543L:Outer space invaders(区间DP)

    题目链接 题意 有n个人,每个人有一个出现时间a和一个开枪时间b和一个距离d,在任意一个时刻,你可以选择炸人,你要炸一个人的花费是和他的距离d,并且所有的已经出现并且还没开枪的和你距离<=d的人 ...

  8. Space Invaders 太空侵略者

    发售年份 1978 平台 街机 开发商 Taito 类型 射击 https://www.youtube.com/watch?v=MU4psw3ccUI

  9. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

随机推荐

  1. 三种比较好玩的黑客效果JS代码(摘取)

    <html> <head> <title>The Matrix</title> <script src="http://ajax.goo ...

  2. 设置datagridview隔行变色

    /// <summary> /// 设置datagridview隔行变色 /// </summary> /// <param name="e"> ...

  3. LeetCode 13、罗马数字转整数

    罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1.12 ...

  4. 题解【洛谷P5767】[NOI1997]最优乘车

    题面 一道很经典的最短路模型转换问题. 考虑如何建图. 我们可以发现,对于每一条公交线路,可以将这条线路上 可以到达的两个点 连一条权值为 \(1\) 的边. 获取一条公交线路上的每一个点可以使用读取 ...

  5. SMTP模块发送邮件

    import os import smtplib # 处理多种形态的邮件主体我们需要 MIMEMultipart 类 from email.mime.multipart import MIMEMult ...

  6. gcc,g++,make,cmake的区别

    首先介绍一下GCC:GNU Compiler Collection(GNU 编译器集合),在为Linux开发应用程序时,绝大多数情况下使用的都是C语言,因此几乎每一位Linux程序员面临的首要问题都是 ...

  7. 【Unity|C#】基础篇(20)——枚举器与迭代器(IEnumerable/IEnumerator)

    [学习资料] <C#图解教程>(第18章):https://www.cnblogs.com/moonache/p/7687551.html 电子书下载:https://pan.baidu. ...

  8. H3C IP路由基础

    一.路由简介 在网络中路由器根据所收到的报文的目的地址选择一条合适的路径,并将报文转发到下一个路由器.路径中最后一个路由器负责将报文转发给目的主机. 路由就是报文在转发过程中的路径信息,用来指导报文转 ...

  9. 欢迎来到L T X的博客 & 博客转型公告

    这里是L T X,一位来自重庆的学生的个人博客. 由于博主以前是OIer,目前博客里主要是OI相关的内容. 但是现在博主已经退役了,因此博客将会转向...嗯...那种...就是那种...比较奇怪的类型 ...

  10. SpringMVC-简单参数绑定

    SpringMVC-简单参数绑定    众所周知,springmvc是用来处理页面的一些请求,然后将数据再通过视图返回给用户的,前面的几篇博文中使用的都是静态数据,为了能快速入门springmvc,在 ...