题目描述

M国的地势高低不平,现给出一个数组代表此国家某纬度上均匀分布的N座山的海拔高度H[i](任意两座山高度不同),已知每座山的山顶上都有一座哨塔,若两个哨兵分别位于第i、j(i<j)座山上,当且仅当两人所在的山比两人之间所有的山都高时,这两个哨兵可以相互监视,M国的防守能力大小为相互监视的哨兵对数。H国早已对M国虎视眈眈,H国的皇帝希望黑魔法师们可以在M国的某两座山之间放置一块巨大的屏障,M国的哨兵不可通过该屏障互相监视。皇帝想让你告诉他最优的屏障放置位置,你是皇帝手下最信任的军师,现在需要你帮助皇帝计算最优的屏障放置位置和最大的防守力减少量。

输入描述:

第一行包含一个正整数T(T≤20)。
对于每组数据,第一行包含一个正整数n(2≤n≤50000)。
接下来n个不同的正整数,H1,H2,H3,…,Hn(0≤Hi≤109)分别代表横截面上每座山的海拔高度。
(读入数据比较大,建议使用scanf而不要使用cin读入)
对于60%的数据,n≤500
对于80%的数据,n≤5000
对于100%的数据,n≤50000

输出描述:

每组数据输出一行形如“Case #N: X C”,N代表当前是第N组数据(从1开始),X代表屏障放置在第X座山前可使M国的防守能力下降最多, 此时减少量为C。若有多种方案使得减少量为C,那么输出最小的X对应的方案。

示例1

输入

2
3
2 1 3
5
4 5 2 6 3

输出

Case #1: 2 2
Case #2: 3 2

链接:https://ac.nowcoder.com/acm/problem/14666
来源:牛客网

解题代码

#include<stdio.h>
#include<string.h>
#define MAX_SIZE 50005
struct STACK{int top;int num[MAX_SIZE];
}st;
void push(int data)
{st.num[++st.top]=data;
}
int isFull()
{if(st.top==54){return 1;}return 0;
}
int isEmpty()
{if(st.top==-1){return 1;}return 0;
}
int top()
{return st.num[st.top];
}
void pop()
{st.top--;
}
void clear()
{st.top=-1;
}
int main()
{st.top=-1;int T,n;int x,c,maxc;int num[50005];int ans[50005];int ans2[50005];scanf("%d",&T);for(int i=1;i<=T;i++){scanf("%d",&n);x=0;maxc=0;c=0;memset(ans,0,sizeof(ans));memset(ans2,0,sizeof(ans2));clear();for(int j=0;j<n;j++){scanf("%d",&num[j]);c=0;while(!isEmpty()&&top()<num[j]){c++;pop();}if(!isEmpty()){ans[j+1]=ans[j]+c+1;}else{ans[j+1]=ans[j]+c;}push(num[j]);}clear();for(int j=n-1;j>=0;j--){c=0;while(!isEmpty()&&top()<num[j]){c++;pop();}if(!isEmpty()){ans2[j+1]=ans2[j+2]+c+1;}else{ans2[j+1]=ans2[j+2]+c;}push(num[j]);}for(int j=1;j<=n-1;j++){if(maxc<ans[n]-ans[j]-ans2[j+1]){maxc=ans[n]-ans[j]-ans2[j+1];x=j;}}printf("Case #%d: %d %d\n",i,x+1,maxc);}
}

解题思路

最优屏障,他是说两个山峰能够监视到他们中间比他们矮的山峰,我们只需要把山峰序列从前到后和从后到前,利用栈,栈顶比当前山峰矮,那么出栈,且变量标识++,表示当前这座山峰能够监视到的山的数量,然后将他存储到数组中。判断当前山峰能够监视到的最大值就行,找到并记录,最后输出。大概这么个思路,没时间画图详解,有空了再详细解释吧。

C/C++数据结构——最优屏障(栈)相关推荐

  1. C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划

    C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划 博文末尾支持二维码赞赏哦 _ github 章3 Stack栈 和 队列Queue= ...

  2. 数据结构,堆和栈和队列的概念

    数据结构,堆和栈和队列的概念 1 什么是数据结构 数据结构是计算机存储,组织数据的反复改.数据结构是指相互之间存在的一种或多种特定关系的数据元素集合. 2 数据结构的逻辑结构 1 集合结构,元素都是孤 ...

  3. c语言用两个栈构造队列伪码,数据结构习题线性表栈队列.doc

    数据结构习题线性表栈队列 线性表(58) 1. 在单链表.双链表和单循环链表中,若仅知道指针p指向某结点,不知道头指针,能否将结点*p从相应的链表中删去?若可以,其时间复杂度各为多少? 2.设线性表的 ...

  4. Java实现自定义队列和树结构_Java数据结构之链表、栈、队列、树的实现方法示例...

    本文实例讲述了java数据结构之链表.栈.队列.树的实现方法.分享给大家供大家参考,具体如下: 最近无意中翻到一本书,闲来无事写几行代码,实现几种常用的数据结构,以备后查. 一.线性表(链表) 1.节 ...

  5. 数据结构与算法之栈入门题目

    数据结构与算法之栈题目 目录 用数组实现大小固定的队列和栈 实现一个特殊的栈,在实现栈的基础功能上,再实现返回栈中最小元素的操作 如果仅用栈结构实现队列结构和如何仅用队列结构实现栈结构 1. 用数组实 ...

  6. 数据结构与算法--利用栈实现队列

    利用栈实现队列 上一节中说明了栈的特点 后进先出,我们用数组的方式实现了栈的基本操作api,因此我们对栈的操作是不考虑排序的,每个api的操作基本都是O(1)的世界,因为不考虑顺序,所以找最大,最小值 ...

  7. 数据结构与算法--简单栈实现及其应用

    栈 栈(Stack)是一种限制插入和删除只能在一个位置上进行的表,改位置是表的末端,叫做栈顶top.栈的基本操作有push (进栈)pop(出栈) 栈又叫做LIFO(后进先出)表,下图展示普通push ...

  8. (王道408考研数据结构)第三章栈和队列-第三节1:栈的应用之括号匹配问题和表达式问题(前缀、中缀和后缀)

    前面我们就说过,栈是一种先进后出的线性表,这种先进后出的特性就决定了它在一类场合或问题中会经常被用到--递归.考研数据结构中所涉及的利用栈结构解决递归问题或者考察栈结构特性的问题主要有这么几类 括号匹 ...

  9. C语言数据结构编程实列,数据结构C语言实现----栈的实例

    用栈的知识,编写一个程序,输入二进制,输出十进制 注意点: 1.在主函数里别忘了先创建一个栈,在进行入栈操作 2.转换过程会用到一个循环,需要用到栈的实际长度作为条件,要在进入循环前先把长度计算出来存 ...

最新文章

  1. greendao3出现 Error:Execution failed for task ':app:greendao'
  2. matlab中conv滤波,其中是Matlab(imfilter)和TensorFlow中偶数滤波器(6x6)的中心像素(转速表nn.conv2d)?...
  3. 基于cropper和sweetalert的简单图片/头像裁剪上传
  4. crc错误 modbus poll_Modbus通讯错误检测方法
  5. @RequestMapping中method的默认值是什么?
  6. ubuntu系统安装gedit
  7. python去掉txt文件行尾换行
  8. php调用python pkl_Python Pickle的任意代码执行漏洞实践和Payload构造
  9. Linux 程 序 员 失 业 警 告
  10. JDBC链接SQLServer2005 Express
  11. 【有奖征文】WEB前端大作战,走在技术最前端!
  12. 微信更新的这功能“炸了”:网友集体吐槽 忍不了
  13. java线程集合点_Jmeter集合点(线程组和同步定时器)
  14. IS-IS报文格式分析
  15. PaaS安全:降低企业风险的四条规则
  16. scala中的集合框架
  17. 【VBScript恶搞代码】电脑自爆警告
  18. 企业信息化管理软件,如何走出开发困境
  19. 动手学深度学习 v2 PDF版本
  20. 如何用python修改安卓和iOS的微信和支付宝步数!

热门文章

  1. 人工智能,大数据,深度学习,机器学习(百度云581G学习资料免费分享)
  2. uniapp 简易的商品分类垂直分类(单项联动)
  3. 工作的思考七:重视邮件
  4. 教程 | 如何使用地图可视化疫情情况
  5. JS 变量保存为本地json文件,读取本地json文件为变量
  6. ERP生产管理系统,如何解决机械制造企业生产管理难题?
  7. NO.6网工学习之QINQ
  8. 请问:现正在广告上的丰胸产物是不是实的?
  9. 永恒之蓝漏洞获取桌面截图
  10. 网易2018校园招聘题目