LC的课后辅导

发布时间: 2015年9月19日 21:42   时间限制: 1000ms   内存限制: 256M

描述

有一天,LC给我们出了一道题,如图:

这个图形从左到右由若干个 宽为1 高不确定 的小矩形构成,求出这个图形所包含的最大矩形面积。

输入

多组测试数据 每组测试数据的第一行为n(0 <= n <= 100), 表示图形有n个小矩形构成 接下来一行输入n个整数h1, h2...hn(0 <= hi <= 1000), 表示每个小矩形的高度 n为0时程序结束

输出

仅输出一行表示面积的最大值

样例输入1 复制

  1. 7
  2. 2 1 4 5 1 3 3
  3. 4
  4. 1000 1000 1000 1000
  5. 0
样例输出1

  1. 8

4000

  1. 思路:开两个数组分别记录每一个矩形以他为中心所能达到的左右长度,然后面积就是h*(r-l+);这里要注意的是如果该矩形比上一个或后一个矩形要小,则上一个矩形所能达到的区间,该矩形一定可以达到,
  2. ac代码:
  3. #include<stdio.h>
  4. int main()
  5. { int a[];
  6. int n,max,i;
  7. while(scanf("%d",&n)!=EOF)
  8. {
  9. if(n==)
  10. break;
  11. for(i=;i<=n;i++)
  12. scanf("%d",&a[i]);
  13. int l[],r[];
  14. l[]=;
  15. r[n]=n;
  16. int t;
  17. for(i=;i<=n;i++)
  18. { t=i;
  19. while(t>&&a[i]<=a[t-])
  20. t=l[t-];
  21. l[i]=t;
  22. }
  23. for(i=n-;i>=;i--)
  24. { t=i;
  25. while(t<n&&a[i]<=a[t+])
  26. t=r[t+];
  27. r[i]=t;
  28. }
  29. int max=-;
  30. for(i=;i<=n;i++)
  31. { if((r[i]-l[i]+)*a[i]>max)
  32. max=(r[i]-l[i]+)*a[i];
  33. }
  34. printf("%d\n",max);}
  35. return ;
  36. }
  37.  
  38. 最近在接触单调栈,又用栈实现了一下,这里维护一个单增栈,那么如果要进栈的数不能直接入栈,说明当前栈顶比他大,就说明它可以延伸,一直到可以进栈为止,也就是说通过维护单增栈我们一定可以找到左面第一个比他小的和右面第一个比他小的;
  39.  
  40. 还有这里因为矩形的高度可能相同,所以当栈为空时说明可以延伸到头或者尾;
  41.  
  42. #include<stdio.h>
  43. #include<string.h>
  44. #include<algorithm>
  45. #include<stack>
  46. #define N 100010
  47. using namespace std;
  48. int a[N],l[N],r[N];
  49. int main()
  50. { int n,i;
  51. while(scanf("%d",&n)!=EOF){
  52. if(n==)
  53. break;
  54. stack<long long >st;
  55. while(!st.empty())
  56. st.pop();
  57. l[]=;
  58. st.push();
  59. for(i=;i<=n;i++)
  60. scanf("%d",&a[i]);
  61. for(i=;i<=n;i++)
  62. {
  63. if(a[st.top()]>=a[i])
  64. { while(!st.empty()&&a[st.top()]>=a[i])
  65. {
  66. st.pop();
  67. }
  68. if(st.empty())
  69. l[i]=;
  70. else
  71. l[i]=st.top()+;
  72. st.push(i);
  73. }
  74. else
  75. { l[i]=i;
  76. st.push(i);
  77. }
  78.  
  79. }
  80. while(!st.empty())
  81. st.pop();
  82. r[n]=n;
  83. st.push(n);
  84. for(i=n;i>=;i--)
  85. {
  86. if(a[st.top()]>=a[i])
  87. { while(!st.empty()&&a[st.top()]>=a[i])
  88. {
  89. st.pop();
  90. }
  91. if(st.empty())
  92. r[i]=n;
  93. else
  94. r[i]=st.top()-;
  95. st.push(i);
  96. }
  97. else
  98. {
  99. r[i]=i;
  100. st.push(i);
  101. }
  102.  
  103. }
  104. //for(i=1;i<=n;i++)
  105. //printf("%d %d\n",l[i],r[i]);
  106. long long ans=;
  107. for(i=;i<=n;i++)
  108. ans=max(ans,(long long)(r[i]-l[i]+)*a[i]);
  109. printf("%lld\n",ans);
  110. }
  111. return ;
  112. }

QDUOJ LC的课后辅导 单调递增栈的更多相关文章

  1. qduoj LC的课后辅导

    描述 有一天,LC给我们出了一道题,如图: 这个图形从左到右由若干个 宽为1 高不确定 的小矩形构成,求出这个图形所包含的最大矩形面积. 输入 多组测试数据每组测试数据的第一行为n(0 <= n ...

  2. POJ - 2796 Feel Good 单调递增栈+前缀和

    Feel Good Bill is developing a new mathematical theory for human emotions. His recent investigations ...

  3. nyoj 单调递增子序列(二)

    单调递增子序列(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 给定一整型数列{a1,a2...,an}(0<n<=100000),找出单调递增最长 ...

  4. HD1160FatMouse's Speed(最长单调递增子序列)

    FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  5. 最长递增子序列问题 nyoj 17单调递增最长子序列 nyoj 79拦截导弹

    一,    最长递增子序列问题的描述 设L=<a1,a2,…,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<aK1,ak2,…,akm>,其中k1< ...

  6. 【LCS,LIS】最长公共子序列、单调递增最长子序列

    单调递增最长子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 求一个字符串的最长递增子序列的长度如:dabdbf最长递增子序列就是abdf,长度为4   输入 ...

  7. nyoj 17 单调递增最长子序列

    单调递增最长子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 求一个字符串的最长递增子序列的长度如:dabdbf最长递增子序列就是abdf,长度为4   输入 ...

  8. NYOJ17,单调递增最长子序列

    单调递增最长子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描写叙述 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf.长度为4 输入 第 ...

  9. [LeetCode] Monotone Increasing Digits 单调递增数字

    Given a non-negative integer N, find the largest number that is less than or equal to N with monoton ...

随机推荐

  1. px rem css 转换工具

    http://520ued.com/tools/rem mark 一下 貌似还挺好用

  2. iOS移动开发周报-第20期

    iOS移动开发周报-第20期iOS移动开发周报-第20期 [摘要]:本期iOS移动开发周报带来如下内容:iOS 通知中心扩展制作入门,iOS APP可执行文件的组成,objc非主流代码技巧等. 教程 ...

  3. java 文件的写入和读取

    //写入操作 方法1 OutputStream f = new FileOutputStream("C:/j/j.txt"); f.write("aaaaaaa" ...

  4. 去除input框的值

    onfocus="this.value=' ';" <input type="text" name="buynum" id=" ...

  5. window下Jira+SQL Server部署+汉化+破解

    网上很多都是jira+mysql部署的文章,由于我现在有需求要用SQL Server数据库,因此就动手试了一下,参考网上许多文章,再加上自己的几次尝试,很快也成功了,分享出来. 全文章节: 一.事前准 ...

  6. Oracle中如何进行进制转换(2进制,10进制,16进制)

    1.16进制转换为10进制 可以通过to_number函数实现 SQL> select to_number('19f','xxx') from dual; TO_NUMBER('19F','XX ...

  7. makefile编写---.c .cpp 混合编译makefile 模板

    # c.cpp混合编译的makefile模板 # # BIN = client_system BASE_INSTALL_DIR := /opt/arm-2009q1 BUILD_TOOL_DIR := ...

  8. 使用kbmmw 的调度事件动态显示时间

    kbmmw 里面提供了强大的事件调度功能,今天简单演示一个使用调度事件在窗体上显示时间. 建立一个新工程. 放上几个控件 在窗体里面引用单元 kbmMWScheduler, 然后添加过程 unit U ...

  9. 2018.11.22-day24 面向对象-继承

    1.归一化设计 2.抽象类 3.钻石继承 4.C3算法 5.新式类中的super

  10. C++笔记之外部类访问内部类的私有成员

    如下图所示 内部类可以访问外部类的私有成员 而外部类无法访问内部类的私有成员 为了能让外部类访问内部类的私有成员,将外部类声明为内部类的友元类即可 #include <iostream> ...