传送门

一道神奇的DP………(鬼知道他为什么在tarjan里面)

一开始可能会考虑贪心或者什么其他神奇的算法,不过还是DP比较靠谱。

我们用f[i]表示摧毁所有i左侧的炸 药包最少需要的能量,用g[i]表示摧毁所有i右侧的炸 药包最少需要的能量。

那么我们只要找到满足j < i,a[i] - a[j] > f[j]+1的最后一个j炸 药包,就可以更新f[i]的值,f[i]  = min(f[i],a[i]-a[j],f[j]+1);

同样的g也是同理。

为什么这么找呢……因为首先我们发现如果a[i]-a[j]比f[j]+1还要小的话,那么从i点引发的爆炸是可以波及到j点的,所以并不需要更新答案,直到不满足的时候我们才更新。

最后枚举爆炸的点就可以了。

然后这题有个技巧,如果往数轴上投炸 药你要么投在点上要么投在两者中间,也就是只可能有整数或者.5的情况。这样直接把所有数据×2计算最后/2就可以了。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
#define enter putchar('\n') using namespace std;
typedef long long ll;
const int M = ;
const int INF = ; int read()
{
int ans = ,op = ;
char ch = getchar();
while(ch < '' || ch > '')
{
if(ch == '-') op = -;
ch = getchar();
}
while(ch >= '' && ch <= '')
{
ans *= ;
ans += ch - '';
ch = getchar();
}
return ans * op;
} int n,f[M],g[M],a[M],head,tail,ans = INF;
int main()
{
n = read();
rep(i,,n) a[i] = read() << ;
sort(a+,a++n);
n = unique(a+,a++n) - a - ;
rep(i,,n) f[i] = g[i] = INF;
f[] = -;
rep(i,,n)
{
while(head + < i && a[i] - a[head+] > f[head+] + ) head++;
f[i] = min(f[head+] + ,a[i] - a[head]);
}
g[n] = -,tail = n;
per(i,n-,)
{
while(tail - > i && a[tail-] - a[i] > g[tail-] + ) tail--;
g[i] = min(a[tail] - a[i],g[tail-] + );
}
//rep(i,1,n) printf("%d %d\n",f[i],g[i]);
head = ,tail = n;
while(head < tail)
{
ans = min(ans,max((a[tail] - a[head]) >> , + max(g[tail],f[head])));
if(f[head+] < g[tail-]) head++;
else tail--;
}
printf("%.1lf\n",(double)ans / 2.0);
return ;
}

最新文章

  1. nyoj_148_fibonacci数列(二)_矩阵快速幂
  2. 2016ACM/ICPC亚洲区大连站-重现赛
  3. HTML5标签改变
  4. Java学习笔记(六):面向对象、接口和抽象类
  5. keil对51单片机变量和函数的编译处理
  6. Java体系总结
  7. 再看ADO对象模型
  8. 软件体系结构经典问题——KWIC的分析和解决
  9. 关于constructor与 Prototype的理解
  10. 请求http服务
  11. 利用linux BT5来破解无线 破解无线
  12. Notepad++ 经常使用快捷键 (MEMO)
  13. c# 操作xml之xmlReader
  14. Sql Server尝试读取或写入受保护的内存。这通常指示其他内存已损坏
  15. shell之路【第三篇】流程控制
  16. PHP基础 windows环境下安装Apache Mysql PHP
  17. K:java中序列化的两种方式—Serializable或Externalizable
  18. C++中的继承(2)类的默认成员
  19. [UE4]让Spline具象化
  20. windows无法安装到这个磁盘。选中的磁盘采用GPT分区形式 Windows 检测到 EFI 系统分区格式化为 NTFS。将 EFI 系统分区个数化为 FAT32,然后重新启动安装

热门文章

  1. JS 回车跳转
  2. 【转】关于大型网站技术演进的思考(二十一)--网站静态化处理—web前端优化—下【终篇】(13)
  3. C 题 KMP中next[]问题
  4. [HAOI2006]受欢迎的牛(tarjan缩点)
  5. 【贪心】HDU 最少拦截系统
  6. firefox自动化测试的常用插件
  7. Sublime3 Preference, Settings-User
  8. PLSQL安装资料
  9. L0、L1与L2范数
  10. 学习LaTex