题意:
题目描述 来自外太空的外星人(最终)入侵了地球。保卫自己,或者解体,被他们同化,或者成为食物。迄今为止,我们无法确定。

外星人遵循已知的攻击模式。有N个外星人进攻,第i个进攻的外星人会在时间ai出现,距离你的距离为d i ,它必须在时间b i 前被消灭,否则被消灭的会是你。

你的武器是一个区域冲击波器,可以设置任何给定的功率。如果被设置了功率R,它会瞬间摧毁与你的距离在R以内的所有外星人(可以等于),同时它也会消耗R单位的燃料电池。

求摧毁所有外星人的最低成本(消耗多少燃料电池),同时保证自己的生命安全。

输入输出格式 输入格式:

第一行输入一个数T,表示有T组数据

每组数据的第一行为外星人的数量n(1<=n<=300)

接下来n+1行,每行有三个数ai,bi,di,表示这个外星人在时间ai出现,距离你di,在bi前时刻死亡

输出格式:

每组输出摧毁所有外星人的最低成本

Translated by @xzx_vyt

思路:
有两个显然的结论:

  1. 选择的点均可以在端点上
  2. 每个时间段内最远的外星人,必须在其时间范围内单独攻击。

对于结论1,如果当前的点不在端点上,那么你往前移往后移都不会影响其攻击到的外星人,于是将其一直移动到端点上就行了。

定义f[i][j]f[i][j]f[i][j]代表消灭时间范围在[i,j][i,j][i,j]内的外星人需要的最低成本。
由结论1,我们只需要考虑端点,所以离散化就好了。
由结论2,每轮我们优先攻击时间范围内最远的外星人,剩下的部分在单独攻击。因为当前的这个最远外星人,现在不攻击,那么你划分完区间后还要在子区间攻击,子区间再攻击,结果肯定不会更优,所以只需要考虑每轮最远的外星人即可。

转移就是f[i][j]=min(f[i][j],f[i][k−1]+f[k+1][j]+a[id].d)f[i][j]=min(f[i][j],f[i][k-1]+f[k+1][j]+a[id].d)f[i][j]=min(f[i][j],f[i][k−1]+f[k+1][j]+a[id].d)
但是注意,当k=ik=ik=i的时候,可能会出现问题。解决办法是定义f[i][i−1]f[i][i-1]f[i][i−1]为0,或者定义f[i][j]f[i][j]f[i][j]为消灭时间范围(i,j)(i,j)(i,j)内外星人最低成本,改为开区间。

很多题解没有考虑这个地方,在n=1的时候输出的结果都是INF,明显错误了。

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <map>using namespace std;
typedef long long ll;const int maxn = 605;
const int INF = 0x3f3f3f3f;struct Node {int a,d,b;
}a[maxn];int num[maxn],cnt,f[maxn][maxn];void init() {sort(num + 1,num + 1 + cnt);cnt = unique(num + 1,num + 1 + cnt) - (num + 1);
}int Find(int x) {return lower_bound(num + 1,num + 1 + cnt,x) - num;
}int main() {int T;scanf("%d",&T);while(T--) {int n;scanf("%d",&n);cnt = 0;memset(f,0x3f,sizeof(f));for(int i = 1;i <= n;i++) {scanf("%d%d%d",&a[i].a,&a[i].b,&a[i].d);num[++cnt] = a[i].a;num[++cnt] = a[i].b;f[i][i - 1] = f[i + 1][i] = 0;}init();for(int i = 1;i <= n;i++) {a[i].a = Find(a[i].a);a[i].b = Find(a[i].b);}for(int len = 1;len <= cnt;len++) {for(int i = 1;i + len - 1 <= cnt;i++) {int j = i + len - 1;int id = 0;for(int k = 1;k <= n;k++) {if(a[k].b <= j && a[k].a >= i && a[id].d < a[k].d) {id = k;}}if(!id) {f[i][j] = 0;continue;}for(int k = a[id].a;k <= a[id].b;k++) {f[i][j] = min(f[i][j],f[i][k - 1] + a[id].d + f[k + 1][j]);}}}printf("%d\n",f[1][cnt]);}return 0;
}

P4766 [CERC2014]Outer space invaders(区间dp)相关推荐

  1. 洛谷P4766 [CERC2014]Outer space invaders题解

    https://www.luogu.com.cn/problem/P4766 description: 有 nnn 个外星人进攻,第 iii 个进攻的外星人会在时间 aia_iai​ 出现,距离你的距 ...

  2. P4766 [CERC2014]Outer space invaders

    自行想象传送门 题解 当我们一看到这个题的tag时就知道这是一道区间dp水题 很明显这个区间就是指时间上的区间 我们用dp[i][j]表示时间i~j之间消灭所有的aliens的最小代价 很明显开不下这 ...

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

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

  4. P4766 [CERC2014]Outer space invaders——思维+区间dp

    题目传送门 思路 这道题思维的转换真的很妙,第 i 个外星人出现的时间区间是 [ai,bi][a_i,b_i][ai​,bi​] ,距离为 did_idi​ , 我们可以以时间区间为横坐标,距离区间为 ...

  5. 题解 P4766 【[CERC2014]Outer space invaders】

    link description: 有 nnn 个外星人进攻,第 iii 个进攻的外星人会在时间 aia_iai​ 出现,距离你的距离为 did_idi​ ,它必须在时间 bib_ibi​ 前被消灭, ...

  6. Cerc2014 Outer space invaders

    Cerc2014 Outer spaceinvaders 有N个外星人,第i个外星人会在ai时间出现,离你距离di,并且必须在bi时间之前被消灭.你有一把很NB的武器,攻击范围是个半径为R的圆,R可以 ...

  7. BZOJ3928 [Cerc2014] Outer space invaders

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

  8. [CERC2014] Outer space invaders

    题目链接 题意 你受到一群外星人的攻击,第 $i$ 个外星人会在 $ai$ 时间出现,与你的距离为 $di$,且必须在 $bi$ 时间前消灭.你有一个区域冲击波器,每次攻击可以设定一个功率 $R$,这 ...

  9. 【Luogu P4766】 [CERC2014]Outer space invaders(区间dp)

    目录 题目 题目描述 输入格式 输出格式 输入输出样例 思路 代码 题目 题目描述 来自外太空的外星人(最终)入侵了地球.保卫自己,或者解体,被他们同化,或者成为食物.迄今为止,我们无法确定. 外星人 ...

最新文章

  1. 超nb的网页标签弹窗js代码!
  2. 程序员,应该掌握的英语词汇
  3. c语言中void指针,C 语言 void指针
  4. 在RichTextEditor组件中使用自定义右键。
  5. 为什么传值时加号变成了空格_为什么中英文字间距不一样?我想谈谈我的理解...
  6. python父类的类成员怎么定义_python如何找到哪些父类定义子对象的方法
  7. 你是怎样“被平均”的?细数统计数据中的那些坑
  8. Python编码风格指南
  9. 调用模块里的action_初级测试人员进阶必备Python编码模块,看过的都说好
  10. Android将应用调试log信息保存在SD卡
  11. 假设检验-统计学自学笔记
  12. win7计算机默认用户名,win7系统任务管理器中用户名没有显示的解决方法
  13. PMSG孕马血清促性腺激素适用的应用方案
  14. Pytorch 模型 查看网络参数的梯度以及参数更新是否正确,优化器学习率设置固定的学习率,分层设置学习率
  15. android对输入手机号码震动,浅析Android手机卫士之抖动输入框和手机震动
  16. 全球及中国抗体药物市场展望规划及专项深度调研报告2021-2027年
  17. matlab 中图字体设置,关于matlab绘图中字体及图片大小等的设置
  18. 谷歌浏览器如何快速安装插件
  19. Mysql-12章-函数和操作符 (翻译+理解)
  20. 计算机重启恢复到推荐分辨率,电脑重启后分辨率变低是什么情况?Win10分辨率无法调整怎么办?...

热门文章

  1. [Python]链式赋值(Chained assignment)
  2. ***详解账号泄露:全球约1亿用户已泄露
  3. Android WIFI架构
  4. 工业4.0下IOT融合技术核心OT节点
  5. 计算机图像双曲线的代码,计算机图形学(二)输出图元_6_OpenGL曲线函数_5_其他曲线...
  6. 复化梯形c语言计算定积分,第六章 函数和宏定义实验(2)
  7. python提取日期中的年月_python3 正则提取年月日、年月、年思路
  8. 实现新闻搜索功能:用户输入关键字,用来匹配新闻标题或内容。
  9. 意云丰到底是一个怎么样的赚钱软件?今天就带大家来解读一下
  10. laravel银联支付