经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
洛谷P1318 积水面积
来源:cnblogs  作者:xy_qwq  时间:2018/12/18 9:39:54  对本文有异议

题目地址: https://www.luogu.org/problemnew/show/P1318

题意简述

给出n个柱子的高度,柱子之间的空隙可以积水,求出最大的积水面积总和。


一道很有意思的模拟题,一开始还没有什么思路,后来发现没有柱子可以悬空,模拟的思路就大概出来了。

我的思路很简单比较好想,就是把柱子分层。

例如题目中的样例,最高的柱子高2个单位长度,那么就把它分为2层,for循环遍历每一层,我们可以发现只要是两侧有柱子的空隙就能接水,就像这个图:

第一层可以找到3个满足这种性质的空隙,第二层也是三个。

$ $

那如果是这样的柱子呢:

虽然最高有2层,即分为2层,但是第二层找不出两个柱子之间的空隙,这种情况可以直接break掉,因为这样的情况一定是在最高层才可能出现。


所以这题就很简单了,读入时进行处理找到最高层,然后进行分层,很明显层数为最高层数。然后写一个getsum函数寻找最左端与最右端的下标,如果一样则没有可以接水的空隙,反之看看这段区间内有多少地方是空的


我是可爱的代码菌OvO:

  1. # include <cstdio>
  2. # include <cstdlib>
  3. # include <iostream>
  4. # include <algorithm>
  5. using namespace std;
  6. inline void gi(int &x) //get_int 快读
  7. {
  8. x=0;int t=1,k=getchar();
  9. for(;k<'0'||k>'9';k=getchar())if(k=='-')t=-1;
  10. for(;k>='0'&&k<='9';k=getchar())x=(x<<1)+(x<<3)+(k^48);x*=t;
  11. }
  12. const int N=10003;
  13. int n, a[N], maxh, h;
  14. int l, r;
  15. bool lf=false, rf=false;
  16. long long ans;
  17. void debug() //debug函数,可以忽略
  18. {
  19. for(int i=1; i<=n; ++i)
  20. cout << a[i] << " ";
  21. puts("");
  22. cout << l << " " << r << endl;
  23. system("pause");
  24. }
  25. inline void getsum() //简陋的寻找下标函数
  26. {
  27. lf=rf=false; //判断是否有柱子出现
  28. for(register int i=1; i<=n; ++i)
  29. if(a[i])
  30. {
  31. lf=true;
  32. l=i; //最左端柱子的下标
  33. break;
  34. }
  35. for(register int i=n; i>=1; --i)
  36. if(a[i])
  37. {
  38. rf=true;
  39. r=i; //最右端柱子的下标
  40. break;
  41. }
  42. return ;
  43. }
  44. int main(void)
  45. {
  46. gi(n);
  47. for(int i=1; i<=n; ++i)
  48. {
  49. gi(a[i]);
  50. maxh=maxh < a[i] ? a[i] : maxh; //找到最大高度,即层数
  51. }
  52. if(!maxh) goto Re; //小优化,最高层为0一定没有可积水的面积
  53. for(int i=1; i<=maxh; ++i) //按层数依次推进
  54. {
  55. getsum();
  56. if(!lf || !rf) break; //没有找到柱子可以直接break
  57. for(int i=l; i<=r; ++i)
  58. {
  59. if(!a[i])
  60. ++ans; //找到这一层的空隙数
  61. }
  62. for(int i=1; i<=n; ++i)
  63. if(a[i]) --a[i];
  64. // debug();
  65. }
  66. printf("%lld", ans);
  67. return 0;
  68. Re:
  69. puts("0");
  70. return 0;
  71. }

代码是之前写的有些地方应该不用特判也行(未尝试)qwq

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号