1442 - Cav
2015-07-21 19:47
260 查看
该题非常巧妙,题意大概是,要像一个洞穴里填装液体燃料,但是洞穴顶上有电线,不能让液体触碰到,但可以无限接近顶 。 求最大存储的液体体积 。
这样就相当于求任意一点i ,使得从该点向左向右延伸都不会碰到天花板 , 的最大高度 。 显然该题的n比较大,我们不能用最常规的思路来解决。 向左向右延伸出的两条射线均不能碰到天花板 , 所以我们不妨将问题分解,先求出从左向右可以延伸的最好情况,再从右向左,然后取最小值就是该点的最好储存情况 。 该题巧妙的利用了对称性,貌似还有一点贪心策略,只不过我现在还没想好怎么给出正确性的严格证明。。
代码如下:
这样就相当于求任意一点i ,使得从该点向左向右延伸都不会碰到天花板 , 的最大高度 。 显然该题的n比较大,我们不能用最常规的思路来解决。 向左向右延伸出的两条射线均不能碰到天花板 , 所以我们不妨将问题分解,先求出从左向右可以延伸的最好情况,再从右向左,然后取最小值就是该点的最好储存情况 。 该题巧妙的利用了对称性,貌似还有一点贪心策略,只不过我现在还没想好怎么给出正确性的严格证明。。
代码如下:
#include<bits/stdc++.h> using namespace std; const int maxn = 1000000 + 5; int T,n,p[maxn],s[maxn],l[maxn],r[maxn]; int main() { scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&p[i]); for(int i=1;i<=n;i++) scanf("%d",&s[i]); int level = s[1]; l[1] = level; for(int i=2;i<=n;i++) { if(p[i] > level) level = p[i]; if(s[i] < level) level = s[i]; l[i] = level; } level = s ; r = level ; int ans = 0; for(int i=n;i>=1;i--) { if(p[i] > level) level = p[i]; if(s[i] < level) level = s[i]; r[i] = level; int v = min(l[i],r[i]); ans += v - p[i]; } printf("%d\n",ans); } return 0; }
相关文章推荐
- 多校7.21A——维护技巧——OO’s Sequence
- android遮挡系统拨号界面 类似360来电显示的那个绿色 页面
- OC_数组 NSSArry中一些重要的用法
- cuda sdk中各文件翻译及功能
- java监听器用法(二):窗口监听器
- LeetCode || Search in Rotated Sorted Array
- C语言不使用库函数对字符串操作
- ZOJ 2109 FatMouse' Trade (背包 dp + 贪婪)
- Swift2学习:Swift概览3-函数和闭包
- 统计字符
- SonarQube 安装及配置
- Hibernate系列-Hibernate原理
- 工作记事 unknownHost
- Hibernate系列-Hibernate原理
- ubuntu下X Windows下网络图标未出现以及后续的设备未托管问题解决方案。
- 幻方的实现,矩阵每行每列每个对角线之和相等
- 1052. Linked List Sorting (25)
- 日文游戏常见日语单词及读音
- UITabBarItem初始化详解及UIImage渲染模式
- 1052. Linked List Sorting (25)