题目大意:

用一个数组代表群山的高度。高度大的地方代表山峰,小的地方代表山谷。山谷可以容水。假设有一天下了大雨,求群山中总共可以容纳多少水?

如图所示情况,a代表该数组,总共可以容纳5个水。

解题思路:

初步想法可以枚举每一个单位,判断是否能放水。这种做法的复杂度为O(n^2*h)其中h为数组最大值,n为数组的大小。效率较低。

进一步观察发现:由于只有山谷可以存水,假设a[i],a[j]>a[k](i<k<j),那么i,j之间的水量可以直接算出,问题降解为两个子问题:求0到i的存水量和j到n-1的存水量

代码:

#include <iostream>
#include <algorithm>
#define maxn 1000
using namespace std; int hills[maxn];
int highest[maxn][maxn];
int highone[maxn][maxn];
int stones[maxn][maxn];
int total = ;
int n; int calWater(int f, int t) {
//not yet implemented
if (f+==t)
return ;
return (t-f-)*min(hills[f], hills[t])-stones[f+][t-];
} void solve(int f, int t) {
if (f >= t)
return;
int n1, n2;
n1 = highone[f][t];
n2 = highest[f][n1-1] > highest[n1+1][n-1] ? highone[f][n1-1] : highone[n1+1][n-1];
if (n1 > n2) {
swap(n1, n2);
}
total += calWater(n1, n2);
solve(f, n1);
solve(n2, t);
} int main() {
int i;
cin >> n;
for (i = ; i < n; i++) {
cin >> hills[i];
}
for (i = ; i < n; i++) {
highest[i][i] = hills[i];
stones[i][i] = hills[i];
highone[i][i] = i;
}
int step = ;
int f,t,m;
while (step <= n) {
for (i = ; i <= n-step; i++) {
f = i;
t = i+step-;
m = (f+t)/;
highest[i][i+step-] = max(highest[i][m], highest[m+][i+step-]);
highone[i][i+step-] = highest[i][m] > highest[m+][i+step-] ? highone[i][m] : highone[m+][i+step-];
stones[i][i+step-] = stones[i][m] + stones[m+][i+step-];
}
step++;
}
solve(, n-);
cout << total << endl;
}

心得体会:

下面一行为吐槽请绕过。

{面试的时候被面试官问傻了(哭,连最简单的方法都没讲出来。唉,估计是终身遗憾了。不过下次面试应该会更轻松一些。要抓紧复习基础知识才行啊!}

这道题虽然简单但是用了分治的思想。没有想到更好的解法,希望有大神指点迷津!

更好的解法!(感谢@MchCyLh)

解题思路:见一楼评论

代码:

#include <iostream>
#include <algorithm> #define maxn 1000 using namespace std; int a[]; int main() {
int n, i;
cin >> n;
for (i = ; i < n; i++) {
cin >> a[i];
}
int l, hl, r, hr, tot = ;
l = hl = ;
r = hr = n-;
while (r-l>) {
if (a[hl] < a[hr]) {
i = ++l;
while (i < r && a[i] <= a[hl]) {
tot += a[hl]-a[i];
l++;
i++;
}
if (i != n) {
hl = i;
}
} else {
i = --r;
while (i > l && a[i] <= a[hr]) {
tot += a[hr]-a[i];
r--;
i--;
}
if (i != -) {
hr = i;
}
} }
cout << tot << endl;
}

复杂度降为O(n)www

Mountains(CVTE面试题)解题报告的更多相关文章

  1. Noip2018普及组初赛试题解题报告

    解题思路: 一.单项选择题 (答案:DDDBBAAAABABBBB) 1.除D外,其余均为输入设备. 2.除D外,其余都等于(617)10 ,D选项为(619)10. 3.1MB=1024KB=102 ...

  2. Facebook Hacker Cup 2014 Qualification Round 竞赛试题 Square Detector 解题报告

    Facebook Hacker Cup 2014 Qualification Round比赛Square Detector题的解题报告.单击这里打开题目链接(国内访问需要那个,你懂的). 原题如下: ...

  3. 北大ACM试题分类+部分解题报告链接

    转载请注明出处:優YoU http://blog.csdn.net/lyy289065406/article/details/6642573 部分解题报告添加新内容,除了原有的"大致题意&q ...

  4. CH Round #56 - 国庆节欢乐赛解题报告

    最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...

  5. 二模13day1解题报告

    二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...

  6. BZOJ 1051 最受欢迎的牛 解题报告

    题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4438  Solved: 2353[S ...

  7. 习题:codevs 2822 爱在心中 解题报告

    这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...

  8. 习题:codevs 1035 火车停留解题报告

    本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...

  9. 习题: codevs 2492 上帝造题的七分钟2 解题报告

    这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...

随机推荐

  1. 使用CallableStatement的用法

    package Test; import java.sql.*; public class Test7 { public static void main(String[] args) { Conne ...

  2. mysql锁 实战测试代码

    存储引擎 支持的锁定 MyISAM 表级锁 MEMORY 表级锁 InnoDB 行级锁 BDB 页面锁 表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最高,并发度最低.行级锁:开销 ...

  3. 《实战Java虚拟机》,最简单的JVM入门书,京东活动,满200就减100了,该出手了

    #京东满200—100单# 图书放血大卖了 <实战Java虚拟机>http://item.jd.com/11670385.html 参加京东满200减 100的大促,就在6.1这一天,仅此 ...

  4. java类,接口浅谈

    一般类,抽象类,接口的使用场景: 类;共同的特征和行为的抽取和封装 接口:标准,规范(功能的扩展)         需要对某个类进行功能的扩展,就让某个类实现这个接口,抽取出来称为接口   内部类: ...

  5. Angular2对待一个URL的处理流程

    直到一年前我还不会想到我会写一本书出来,直到两三年前我还不会想到会把自己的业余时间放在写作(技术博客)上.当初在机缘巧合之下,我只是想把自己工作中遇到的问题总结起来,发布在博客中以供日后查阅.不想竟然 ...

  6. MySQL主主复制+MMM实现高可用

    架构图: 环境规划 角色 IP VIP 用途 DB1 192.168.56.101 192.168.56.111/113 主Master提供wirte+read DB2 192.168.56.102 ...

  7. 前端开发与SEO

    前端开发中通过一些小习惯,可以有利于SEO,本着蚊子再小也是肉的原则,能抓住自然不能忽略. 1.控制首页链接数量,不能过多,也不要太少.更不要为了凑数而添加 2.扁平化层次,力争跳转三次可以到任何页面 ...

  8. Ruby-随机数

    --随机0-1 rand --随机一个范围 rand(1..100)

  9. wordpress 自定义登录表单

    wordpress 有很多插件支持自定义登录表单,本文讨论无插件形式. 自定义登录表单又分为两种 自定义登录表单 在前端创建一个登录页面

  10. 别再为了iOS新系统设备而重新安装一个新版Xcode了.其实我们可以添加版本支持

    众所周知,Xcode7.3的代码补全是有问题的  如导入自定义类之后,在代码中并不会补全相应的类名... 但Xcode7.2是没有这个问题的,但很多时候我们自己的设备都升级到了iOS9.3.X系统,导 ...