Question

战争游戏的至关重要环节就要到来了,这次的结果将决定王国的生死存亡,小B负责首都的防卫工作。首都位于一个四面环山的盆地中,周围的n个小山构成一个环,作为预警措施,小B计划在每个小山上设置一个观察哨,日夜不停的瞭望周围发生的情况。 一旦发生外地入侵事件,山顶上的岗哨将点燃烽烟,若两个岗哨所在的山峰之间没有更高的山峰遮挡且两者之间有相连通路,则岗哨可以观察到另一个山峰上的烽烟是否点燃。由于小山处于环上,任意两个小山之间存在两个不同的连接通路。满足上述不遮挡的条件下,一座山峰上岗哨点燃的烽烟至少可以通过一条通路被另一端观察到。对于任意相邻的岗哨,一端的岗哨一定可以发现一端点燃的烽烟。 小B设计的这种保卫方案的一个重要特性是能够观测到对方烽烟的岗哨对的数量,她希望你能够帮她解决这个问题。

输入描述

输入中有多组测试数据,每一组测试数据的第一行为一个整数n(3≤n≤106),为首都周围的小山数量,第二行为n个整数,依次表示为小山的高度h(1≤h≤109).

输出描述

对每组测试数据,在单独的一行中输出能相互观察到的岗哨的对数。

思路

你要说这是单调栈板子题似乎有点看不起京东。总结一下,两座山A,B之间能通信的要求是,A,B之间的点都比这个点小,确实看到这很容易想到单调栈,构建一个单调递减栈,以1,2,4,5,3为例。

首先找到这些元素中的最大值,以最大值作为起点进行入栈操作,那么5,3,1依次入栈,接下来要入栈的是2,2大于1,所以1出栈,1的左边(3),右边(2)。那么1是可以看到2和3的,有两对。res += 2

4准备进栈,4大于2,所以2要出栈,2的左边(3),右边(4),res += 2。

同理,3也要出栈,res += 2。此时栈里面只有4和5作为一对,res += 1。

上述是一种特殊情况,没有重复元素时,如果有重复元素,假设数组是4,4,5,5,6,6,此时stack中存的是一个pair,pair中包含两个变量,当前存的值,以及该值的个数,比方说遍历数组,首先是下标为4的6先进栈,然后下标为5的6进栈,因为值相同,所以pair.times++,然后两个4进栈,此时的情况见下图

4要出栈,但是此时res要加多少呢?这其实是一个排列组合的问题res += C(4,2)+2*2,然后两个5都进来了,数组遍历结束,但是此时栈中还有值

数组遍历完了,但是栈中还有值,这种情况要特殊讨论

  • 栈中元素个数大于2,res += C(stack.peek().times,2) + 2*stack.pop().times
  • 栈中元素个数等于2
    • 如果栈底元素的times==1,则res += C(stack.peek().times,2)+stack.pop().times
    • 如果栈底元素的times !=1 ,则res += C(stack.peek().times,2)+2*stack.pop().times
  • 栈中元素小于2(就一个),res += C(stack.pop().times,2)

代码

package nowcoder;
import java.util.*;
public class Main {public static int nexIndex(int size,int i) {return i < (size - 1) ? (i + 1) : 0;}private static class Pair {public int value;public int times;Pair(int value) {this.value = value;this.times = 1;}}public static long getInternalSum(int k) {return k == 1L ? 0L : (long)k * (long)(k - 1) / 2L;}public static long communications(int[] arr) {if(arr == null || arr.length < 2)return 0;int size = arr.length;int maxIndex = 0;for(int i = 0;i < size;i++)maxIndex = arr[maxIndex] < arr[i] ? i : maxIndex;int value = arr[maxIndex];//最大值int index = nexIndex(size,maxIndex);//最大值的下一个long res = 0L;Stack<Pair> stack = new Stack<Pair>();stack.push(new Pair(value));while(index != maxIndex) {value = arr[index];while(!stack.isEmpty() && stack.peek().value < value) {int times = stack.pop().times;res += getInternalSum(times) + 2 * times;//C(times,2) + 2 * times}if(!stack.isEmpty() && stack.peek().value == value) stack.peek().times++;else stack.push(new Pair(value));index = nexIndex(size,index);}while(!stack.isEmpty()) {int times = stack.pop().times;res += getInternalSum(times);if(!stack.isEmpty()) {res += times;if(stack.size() > 1)res += times;else res += stack.peek().times > 1 ? times : 0;}}return res;}public static void main(String[] args) {Scanner cin = new Scanner(System.in);while(cin.hasNext()) {int n = cin.nextInt();int[] arr = new int[n];HashSet<Integer> tmp = new HashSet<Integer>();for(int i = 0;i < n;i++) {arr[i] = cin.nextInt();tmp.add(arr[i]);}if(tmp.size() == n)//没有重复元素,直接用结论System.out.println((long)2 * n - 3);elseSystem.out.println(communications(arr));}}
}

保卫方案(京东笔试题)相关推荐

  1. 2019 java 京东笔试题

    想进京东的同学注意了,这里是修真院面试笔记整理,那么这里就给大家分享一下 [2019 java 京东笔试题] JVM的内存结构和管理机制: JVM实例运行 JVM实例消亡 JVM的生命周期 JVM的内 ...

  2. 京东笔试题 小东拉票,从其他候选人抢票

    输入有若干组,每组包括两行,每一行为一个正整数,表示候选者的数量,第二行为各候选者的选票数,小东要拉票才能的冠军,第一个是小东的选票数. 话不多说,大家这么捉急,题目自己看,直接上代码了 #inclu ...

  3. 2019面试/笔试题(算法题)总结

    实战链接:https://www.acwing.com/activity/content/8/ Google KickStart 2019 A轮 1. 训练 题目描述 作为一名学校足球教练,你的任务是 ...

  4. 2018年京东春招笔试题

    2018年京东春招笔试题(2018.04.09) 题目一 整数分解 题目描述 小Q的数学老师给小Q一个整数N,问小Q能否将W分解为两个整数X和Y相乘,并且满足X为奇数,Y为偶数.即能否找到奇数X和偶数 ...

  5. 【笔试题】京东2017秋招笔试真题

    笔试题 京东2017秋招笔试真题 1.进制均值 时间限制 C/C++语言 1000MS;其他语言 3000MS 内存限制 C/C++语言 65536KB;其他语言 589824KB 题目描述 尽管是一 ...

  6. 名企笔试:京东 2016 算法工程师笔试题(登楼梯)

    名企笔试:京东 2016 算法工程师笔试题(登楼梯) 2017-02-04 算法爱好者 有一段楼梯台阶有 15 级台阶,以小明的脚力一步最多只能跨 3 级,请问小明登上这段楼梯,有多少种不同的走法? ...

  7. 互联网公司招聘--京东--产品岗-2017年笔试题

    互联网公司招聘–京东–产品岗-2017年笔试题 互联网公司招聘–京东–产品岗-2017年笔试题 互联网公司招聘–京东–产品岗-2017年笔试题 1.你有没有什么实习经历或实践,这些实践活动锻炼了你哪方 ...

  8. 京东2018校招研发笔试题记录

    背景 这几天正好是各大互联网公司校招笔试的时间,于是陪着同学一起做了一下京东的笔试题.其中单选和不定项选择题涵盖的范围还是比较广的,包括子网掩码的计算.linux相关知识点.C++知识点.设计模式等. ...

  9. [笔试题记录]T01 最优高铁修建方案

    T01 最优高铁修建方案 2022年8月3日记录,记录最近遇到的几道笔试题: 最优城市高铁修建方案 给定城市数量,可建设高铁的两个城市间的修建成本列表,以及结合城市商业价值会固定建设的两个城市间高铁. ...

最新文章

  1. Android下载图片路径问题
  2. BZOJ 4086: [Sdoi2015]travel(SDOI2015 round2 day1)(分类讨论+容斥原理)
  3. 实验9:Problem D: 从点到面
  4. FreeType(字体渲染引擎):支持多种字体格式(TTF,TTC等)
  5. php 中set是什么_php中set
  6. Google Mock启蒙篇 [1] (Google C++ Mocking Framework for Dummies 翻译)
  7. 一个迄今为止最快的并发键值存储库FASTER诞生
  8. 【C++基础】 类模板
  9. 我的makefile写法(一)
  10. c语言转换为python语言_python和c语言
  11. oracle函数 sysdate
  12. SpringMVC 模型数据
  13. debian GNU linux 版的docker 安装vi
  14. virtualenv
  15. 使用Python和Numpy进行波士顿房价预测任务(一)【深度学习入门_学习笔记】
  16. 君康人寿2019年排名_君康人寿易主后 内部提出五年上市计划
  17. LVS+KeepAlived,RabbitMQ高可用负载均衡
  18. 图像调优1:清晰度相关参数MTF,SFR,MTF50,MTF50P 以及TVL的概念以及换算说明
  19. 如何在虚拟机安装鸿蒙os,VirtualBox安装教程
  20. 论坛刷访客神器-Header自定义工具

热门文章

  1. windows系统启动tomcat服务的三种方式
  2. 利用superlance监控supervisor运行状态
  3. 反欺诈指南|网购平台如何保障公平交易
  4. 软件测试修炼之道(转载)
  5. Cocoapods安装教程
  6. Simulink永磁同步电机控制仿真:过调制及电流重构
  7. 文摘:成人呈现期研究
  8. 计算机基础教学-大学生明星观
  9. java毕业生设计中学后勤设备保修维护管理系统计算机源码+系统+mysql+调试部署+lw
  10. 测试幼儿园指南纲要的软件,幼儿《指南》与《纲要》