积木大赛:

  之前没有仔细地想,然后就直接暴力一点(骗点分),去扫每一高度,连到一起的个数,于是2组超时

先把暴力程序贴上来(可以当对拍机)

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. FILE *fin = fopen("block.in","r");
  5. FILE *fout= fopen("block.out","w");
  6. int *h;
  7. int n;
  8. int maxHeight = -;
  9. long long times = ;
  10. int main(){
  11. fscanf(fin,"%d",&n);
  12. h = new int[(const int)(n + )];
  13. for(int i = ;i <= n;i++){
  14. fscanf(fin,"%d",&h[i]);
  15. if(h[i] > maxHeight) maxHeight = h[i];
  16. }
  17. char isNew = 0x00;
  18. for(int i = ;i <= maxHeight;i++){
  19. isNew = 0x00;
  20. for(int j = ;j <= n;j++){
  21. if(h[j] >= i && isNew == ){
  22. times++;
  23. isNew = 0x01;
  24. }
  25. if(h[j] < i && isNew== 0x01){
  26. isNew = 0x00;
  27. }
  28. }
  29. }
  30. fprintf(fout,"%ld",times);
  31. }

  然而用样例来举个例子

  1. *
  2. * *
  3. * * * *
  4. * * * * *
  5. -----------------------------

  当第i列的目标高度比第(i-1)高的时候,很容易发现,需要多耗费(h[i]-h[i - 1])次操作,因为在操作使第(i-1)列达到目标高度时,第i列和目标高度还差

(h[i]-h[i - 1]),每次只能放一层的积木,所以需要多耗费(h[i]-h[i - 1])次操作。

  例如把第一层放满,其它层还需要的高度

  1.  
  2. *
  3. * * *
  4. -----------------------------

  这样会很奇怪,为什么第5列还需要放一次呢?那是因为第一次方的区间是[1,5],每次求差相当于把这一块连续的这一块放上积木

从图中可以看出如果h[i] <= h[i - 1]则不用处理,于是我们可以得到如下递推式

  1. |- f[i - ] ( h[i] <= h[i - 1] )
  2. f[i]=|
  3. |- f[i - ] + ( h[i]-h[i - 1] ) ( h[i] > h[i - 1] )

最后,附上代码,说明长,代码不长:

  1. #include<iostream>
  2. #include<fstream>
  3. using namespace std;
  4. ifstream fin("block.in");
  5. ofstream fout("block.out");
  6. int buffer[];
  7. int n;
  8. long long result = ;
  9. int main(){
  10. fin>>n;
  11. for(int i = ;i <= n;i++){
  12. fin>>buffer[];
  13. if( buffer[] > buffer[] ) result += buffer[] - buffer[];
  14. buffer[] = buffer[];
  15. }
  16. fout<<result;
  17. return ;
  18. }

积木大赛


花匠:

  这道题最开始用的是DP,虽然没有优化且明知复杂度是O(N2)但还是用它去骗骗分

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. FILE *fin = fopen("flower.in","r");
  5. FILE *fout= fopen("flower.out","w");
  6. int *f;
  7. int *f1;
  8. int *h;
  9. int n;
  10. int main(){
  11. fscanf(fin,"%d",&n);
  12. f = new int[(const int)(n + )];
  13. f1 = new int[(const int)(n + )];
  14. h = new int[(const int)(n + )];
  15. for(int i = ;i <= n;i++){
  16. fscanf(fin,"%d",&h[i]);
  17. f[i] = ;
  18. f1[i] = ;
  19. }
  20. for(int i = ;i <= n; i++){
  21. for(int j = i-;j > ;j--){
  22. if(f[j]% == &&h[i]>h[j]){
  23. f[i] = max( f[j] + ,f[i]);
  24. }
  25. if(f1[j]% == &&h[i]<h[j]){
  26. f1[i] = max(f1[j] + ,f1[i]);
  27. }
  28. if(f[j]% == &&h[i]<h[j]){
  29. f[i] = max(f[j] + ,f[i]);
  30. }
  31. if(f1[j]% == &&h[i]>h[j]){
  32. f1[i] = max(f1[j] + ,f1[i]);
  33. }
  34. }
  35. }
  36. int maxv = -;
  37. for(int i = ;i <= n;i++){
  38. maxv = max(f[i],maxv);
  39. maxv = max(f1[i],maxv);
  40. }
  41. fprintf(fout,"%ld",maxv);
  42. return ;
  43. }

  至于最简单、快捷的方法就是找拐点,一个拐点就是一个答案,至于依据嘛,画画图就能理解了

  1. #include<iostream>
  2. #include<fstream>
  3. #include<cstring>
  4. using namespace std;
  5. ifstream fin("flower.in");
  6. ofstream fout("flower.out");
  7. int n;
  8. int *h;
  9. int result = ;
  10. void init(){
  11. fin>>n;
  12. h = new int[(const int)(n + )];
  13. memset(h, ,sizeof(int)*(n + ));
  14. for(int i = ;i <= n;i++){
  15. fin>>h[i];
  16. }
  17. }
  18. char aFlag = -;
  19. int main(){
  20. init();
  21. for(int i = ;i < n; i++){
  22. if(h[i] > h[i + ] && (aFlag == || aFlag == -) ){
  23. result++;
  24. aFlag = ;
  25. }
  26. if(h[i] < h[i + ] && (aFlag == || aFlag == -) ){
  27. result++;
  28. aFlag = ;
  29. }
  30. }
  31. fout<<result;
  32. return ;
  33. }

花匠-找拐点

noip 2013 提高组 Day2 部分题解的更多相关文章

  1. NOIP 2013 提高组 day2 积木大赛

      积木大赛 描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为 n 的大厦,大厦可以看成由 n 块宽度为1的积木组成,第

  2. noip 2012 提高组 day2 部分题解

    这道题有多种解法,我用的是扩展欧几里得算法求到的答案 #include<iostream> #include<fstream> #include<cstdio> u ...

  3. NOIP 2015 提高组 Day2

    期望得分:100+10+60=170 实际得分:100+10+35=145 http://www.cogs.pro/cogs/page/page.php?aid=16 T1 跳石头 时间限制:1 s  ...

  4. NOIP 2013 提高组 day1 T2 火柴排队 归并 逆序对

    描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:∑i=1n(ai−bi)2∑i=1n(ai−bi) ...

  5. NOIP 2013提高组day 1 T 1转圈游戏 快速幂

    描述 n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏.按照顺时针方向给 n 个位置编号,从0 到 n-1.最初,第 0 号小伙伴在第 0 号位置,第 1 号小伙伴在第 1 号位置,……,依此类推 ...

  6. noip 2013 提高组 day1

    1.转圈游戏: 解析部分略,快速幂就可以过 Code: #include<iostream> #include<fstream> using namespace std; if ...

  7. NOIP 2014 提高组 Day2

    期望得分:100+60+30=190 实际得分:70+60+30=160 https://www.luogu.org/problem/lists?name=&orderitem=pid& ...

  8. NOIP 2013 提高组 洛谷P1967 货车运输 (Kruskal重构树)

    题目: A 国有 nn 座城市,编号从 11 到 nn,城市之间有 mm 条双向道路.每一条道路对车辆都有重量限制,简称限重. 现在有 qq 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情 ...

  9. NOIP 2008提高组第三题题解by rLq

    啊啊啊啊啊啊今天已经星期三了吗 那么,来一波题解吧 本题地址http://www.luogu.org/problem/show?pid=1006 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们 ...

随机推荐

  1. Oracle管理监控之如何对数据库进行监控检查

    oracle自动工作负载库(AWR):采集与性能相关的统计数据,并从统计的数据中导出性能量度,以跟踪数据库潜在的问题. 如何生成oracle数据库的自动负载库报告. 手工生成一份oracle数据库的快 ...

  2. 解决oracle12c安装报“[INS-30131]执行安装程序验证所需的初始设置失败(原因:无法访问临时位置)”方法

    安装过很多次oracle,顺顺利利的,今天在新机子上安装oracle12c client过程中竟然神奇的报出一个错误: 很明显的,已经很明确的给出了安装失败的原因:无法访问临时位置!实际上,在安装数据 ...

  3. RFQ 、IFB、RFP 、RFI的区别是什么

    询价类型 信息索取书 RFI 报价申请书 RFQ 建议要求书 RFP 投标邀请书 IFB 目的 获得与产品服务供应商相关信息 取得供应商对所需产品.服务或服务的承诺 要求供应商对需求提出最好解决方案建 ...

  4. function $(id) {}表示什么函数

    function $(id) {}表示什么函数 一.总结 1.就是简写,不然每次打document.getElementById很烦 二.问题 function $(id) {return docum ...

  5. [python+opencv] ROI(Range Of Interest)与泛洪填充

    python+opencv3.3视频教学 基础入门笔记(贾志刚老师) https://www.bilibili.com/video/av24998616/?p=8 ROI(Range Of Inter ...

  6. 【Python】关于Python多线程的一篇文章转载

    猪哥推荐的学习网址 http://www.jb51.net/article/110164.htm yeayee ------>更多技巧------>更多源码------>http:/ ...

  7. android 网络监测

    public class NetWorkStateReceiver extends BroadcastReceiver { @Override public void onReceive(Contex ...

  8. 使用PHP创建一个REST API(译)

    最近API在网络领域有些风靡,明确的说是REST的影响力.这实在没什么好惊讶的,因为在任何编程语言中,消费REST API都是非常的容易.构建它也非常的简单,因为本质上你不会用到任何那些已存在很久的H ...

  9. selenium python 启动Chrome

    启动Chrom浏览器 下载chromedriver: http://chromedriver.storage.googleapis.com/index.html 当时找chromedriver与chr ...

  10. [LeetCode] 127. Word Ladder _Medium tag: BFS

    Given two words (beginWord and endWord), and a dictionary's word list, find the length of shortest t ...