https://www.luogu.com.cn/problem/P4766

description:

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

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

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

solution:

这道题我们可以考虑区间dp。

设 f[l][r]f[l][r]f[l][r] 表示在 [l,r][l,r][l,r] 上最低的成本。

但是我们发现,坐标的范围达到了 1e41e41e4,这就意味着数组也会开得较大。我们不妨离散化一下。(因为 nnn 较小)

然后考虑如何转移。

发现对于一段时间区间,我们可以贪心的消去最远的外星人,这样浪费就少。

于是,我们以最远的外星人为转移契机:

f[l][r]=f[l][k−1]+f[k+1][r]+d[tag](a[tag]≤k≤b[tag])f[l][r]=f[l][k-1]+f[k+1][r]+d[tag](a[tag]\leq k\leq b[tag])f[l][r]=f[l][k−1]+f[k+1][r]+d[tag](a[tag]≤k≤b[tag]),其中 tagtagtag 为该段时间内最远的外星人的序号。

#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
map<int,int>mp;
int f[705][705];//f[l][r]表示[l,r]这段时间所需的花费。
int a[1005],b[1005],d[1005];
int main()
{int T;scanf("%d",&T);while(T--){memset(f,0,sizeof(f));for(int i=1;i<=10000;i++)mp.clear();int n,cnt=0;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d%d%d",&a[i],&b[i],&d[i]);mp[a[i]]=1;//离散mp[b[i]]=1;}for(int i=1;i<=10000;i++){if(mp[i]==1){mp[i]=++cnt;//重新编号}  }for(int i=1;i<=n;i++){a[i]=mp[a[i]];//赋值编排b[i]=mp[b[i]];}for(int len=1;len<cnt;len++)//众所周知,区间dp的第一层循环要先枚举区间的长度。{//printf("test\n");for(int i=1;i+len<=cnt;i++)//接着是区间的起始点。{// printf("Test2\n");int j=i+len;f[i][j]=1000000000;int tag,ans=0;for(int k=1;k<=n;k++){//printf("Test3\n");if(a[k]>=i&&b[k]<=j&&d[k]>ans)//寻找最大的外星人。{ans=d[k];tag=k;}}if(ans==0){f[i][j]=0;continue;}for(int k=a[tag];k<=b[tag];k++)//在这个最大的外星人的安全时间内的区间都可以如此合并。f[i][j]=min(f[i][j],f[i][k-1]+f[k+1][j]+ans);}} printf("%d\n",f[1][cnt]);}return 0;
}

洛谷P4766 [CERC2014]Outer space invaders题解相关推荐

  1. P4766 [CERC2014]Outer space invaders

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

  2. P4766 [CERC2014]Outer space invaders(区间dp)

    题意: 题目描述 来自外太空的外星人(最终)入侵了地球.保卫自己,或者解体,被他们同化,或者成为食物.迄今为止,我们无法确定. 外星人遵循已知的攻击模式.有N个外星人进攻,第i个进攻的外星人会在时间a ...

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

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

  4. Cerc2014 Outer space invaders

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

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

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

  6. Luogu_P4766 [CERC2014]Outer space invaders【题解】区间DP

    题面:https://www.luogu.org/problem/P4766 非常容易就想到以时间为区间来DP. 但是时间比较大,需要离散化. 转移方程就是: f[l][r]=min(f[l][k-1 ...

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

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

  8. bzoj 3928: [Cerc2014] Outer space invaders

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

  9. BZOJ3928 [Cerc2014] Outer space invaders

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

最新文章

  1. WeakReference回收问题
  2. vmware, failed to lock the file 的解决
  3. 20180826(01)-Java数据结构
  4. 在Eclipse中导入dtd和xsd文件,使XML自动提示
  5. [EffectiveC++]item02:尽量以const,enum,inline代替#define
  6. linux词语大全,简单词语大全二字学习软件-简单词语大全四字下载v1.5.3-Linux公社...
  7. Python中可变长度的参数args和**kwargs
  8. python模块time_python模块之time和datetime
  9. csu 1812: 三角形和矩形 凸包
  10. PyTorch-GPU版本、Tensorflow-GPU版本配置
  11. 廖雪峰python学习笔记之访问数据库
  12. JAVA毕设项目-网上订餐系统(附:源码 论文 Sql文件)
  13. Objective C 单例实现
  14. 字体磅数与字号对照表
  15. XXXX软件项目系统测试报告
  16. 大数据、云计算和物联网三者的关系
  17. 系统运维工程师必备面试题库
  18. macos high sierra
  19. 阿里云视频服务之点播服务
  20. ViT/vit/VIT详解

热门文章

  1. Android 程序员的技术栈大全
  2. 电脑必备高质量软件,各有千秋,总有一款能惊艳到你
  3. 解决 BM8563 RTC时间乱跳问题
  4. [PyQt] Python界面编程学习总结
  5. png24 图片透明底
  6. 清除Windows安全中心保护历史记录
  7. Looop运行日本首座支持直流1500V电压的百万光伏电站
  8. flink hop window测试
  9. 【AI视野·今日CV 计算机视觉论文速览 第219期】Tue, 15 Jun 2021
  10. Centos7安装和配置Mysql5.7_CentOS7安装和配置MySQL5.7