题目描述

春春幼儿园举办了一年一度的“积木大赛”。今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi。

在搭建开始之前,没有任何积木(可以看成n块高度为 0 的积木)。接下来每次操作,小朋友们可以选择一段连续区间[l, r],然后将第第 L 块到第 R 块之间(含第 L 块和第 R 块)所有积木的高度分别增加1。

小 M 是个聪明的小朋友,她很快想出了建造大厦的最佳策略,使得建造所需的操作次数最少。但她不是一个勤于动手的孩子,所以想请你帮忙实现这个策略,并求出最少的操作次数。

输入输出格式

输入格式:

输入文件为 block.in

输入包含两行,第一行包含一个整数n,表示大厦的宽度。

第二行包含n个整数,第i个整数为hi 。

输出格式:

输出文件为 block.out

仅一行,即建造所需的最少操作数。

输入输出样例

  1. 5
  2. 2 3 4 1 2
输出样例#1:

  1. 5

说明

【样例解释】

其中一种可行的最佳方案,依次选择

[1,5] [1,3] [2,3] [3,3] [5,5]

【数据范围】

对于 30%的数据,有1 ≤ n ≤ 10;

对于 70%的数据,有1 ≤ n ≤ 1000;

对于 100%的数据,有1 ≤ n ≤ 100000,0 ≤ hi≤ 10000。

思路:

  这道题很深,你可以做的很麻烦,也可以做的很简单,你都认为那是正解。

  我就想了很多思路,然后用了最麻烦的方法。。但至少练习了一下倍增

  1递归去做  

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<queue>
  4. #include<algorithm>
  5. #include<vector>
  6. #include<cmath>
  7. #include<ctime>
  8. using namespace std;
  9. const int N=;
  10. int a[N];
  11. int n;
  12. int f1[N][],F;//zhi
  13. int f2[N][];//where
  14. long long ans;
  15. inline void work(int L,int R,int tot)
  16. {
  17. if(L==R)
  18. {
  19. ans+=a[L]-tot;
  20. return ;
  21. }
  22. if(L>R) return ;
  23. int F=(log2(R-L+)/log2());
  24. int minn,minw;
  25. if(f1[L][F]<=f1[R-(<<F)+][F])
  26. minn=f1[L][F],minw=f2[L][F];
  27. else
  28. minn=f1[R-(<<F)+][F],minw=f2[R-(<<F)+][F];
  29. ans+=minn-tot;
  30. work(L,minw-,minn);work(minw+,R,minn);
  31. return ;
  32. }
  33. int main()
  34. {
  35.  
  36. scanf("%d",&n);
  37. F=(log2(n)/log2());
  38. for(int i=;i<=n;i++)
  39. {
  40. scanf("%d",&a[i]);
  41. f1[i][]=a[i];
  42. f2[i][]=i;
  43. }
  44. for(int j=;j<=F;j++)
  45. for(int i=;i<=n;i++)
  46. {
  47. if(f1[i][j-]<=f1[i+(<<(j-))][j-])
  48. f1[i][j]=f1[i][j-],f2[i][j]=f2[i][j-];
  49. else
  50. f1[i][j]=f1[i+(<<(j-))][j-],f2[i][j]=f2[i+(<<(j-))][j-];
  51. }
  52. work(,n,);
  53. cout<<ans<<endl;
  54. return ;
  55. }

倍增,递归

  2有点贪心吧,我也说不清

  就是如果后一个比前个,大就要加它们的差。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<queue>
  4. #include<algorithm>
  5. #include<vector>
  6. #include<cmath>
  7. #include<ctime>
  8. using namespace std;
  9. const int N=;
  10. int x,last,n;
  11. long long ans;
  12. int main()
  13. {
  14. scanf("%d",&n);
  15. for(int i=;i<=n;i++)
  16. {
  17. scanf("%d",&x);
  18. if(x>last) ans+=x-last;
  19. last=x;
  20. }
  21. cout<<ans;
  22. return ;
  23. }

贪心

洛谷 P1969 积木大赛的更多相关文章

  1. 洛谷 P1969 积木大赛 解题报告

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

  2. [NOIP2013] 提高组 洛谷P1969 积木大赛

    题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前,没有任何积木(可以看成 ...

  3. 洛谷—— P1969 积木大赛

    https://www.luogu.org/problem/show?pid=1969 题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度 ...

  4. 洛谷 P1969 积木大赛(NOIP2013)

    题目描述春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前,没有任何积木(可以看成n ...

  5. 洛谷 P1969 积木大赛 —— 水题

    题目:https://www.luogu.org/problemnew/show/P1969 看每个高度和前面的关系即可. 代码如下: #include<iostream> #includ ...

  6. noip2018 洛谷 P1969积木大赛

    1 //一定不要忘记这句话 “连续区间 ”!! #include<bits/stdc++.h> using namespace std; int main(){ int n, h;//n是 ...

  7. 洛谷P1969 [NOIP2013提高组Day2T1] 积木大赛

    P1969 积木大赛 题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前, ...

  8. 洛谷P2342-叠积木

    Problem 洛谷P2342-叠积木 Accept: 373   Submit: 1.1k Time Limit: 1000 mSec    Memory Limit : 128MB Problem ...

  9. AC日记——积木大赛 洛谷 P1969

    题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前,没有任何积木(可以看成 ...

随机推荐

  1. 集训Day5

    生活还得继续 bzoj3771 题面让我笑了很长时间 给出 n个物品,价值为别为Xi且各不相同,现在可以取1个.2个或3个,问每种价值和有几种情况? *顺序不同算一种 很傻逼的一个母函数+容斥,用A( ...

  2. ACM学习历程—HDU4725 The Shortest Path in Nya Graph(SPFA && 优先队列)

    Description This is a very easy problem, your task is just calculate el camino mas corto en un grafi ...

  3. 【LeetCode】031. Next Permutation

    题目: Implement next permutation, which rearranges numbers into the lexicographically next greater per ...

  4. /boot下面文件说明

    config-3.10.0-229.el7.x86_64 <==此版本核心被编译时选择的功能与模组设定档 grub/ <==旧版 grub1 ,不需要理会这目录了! grub2/ < ...

  5. poj1325机器工作——二分图最小点覆盖

    题目:http://poj.org/problem?id=1325 二分图求最大匹配,即为最小点覆盖: 一开始我写得较麻烦,求出最大匹配又去搜增广路,打标记求最小点覆盖: 然而两种方法都没写“ans= ...

  6. poj2955——括号匹配

    题目:http://poj.org/problem?id=2955 区间DP. 代码如下: #include<iostream> #include<cstdio> #inclu ...

  7. Oracle查询24小时制的时间格式

    select to_date('2016-11-11 13:42:27', 'yyyy/mm/dd hh24:mi:ss') from dual.

  8. <meta> 标记汇总

    1.  <meta name="viewport" content="width=device-width, initial-scale=1"> v ...

  9. Sleep 比对 (Win32API 与 STL )

    OutputDebugStringA("begin 1========"); for (int i = 0; i < 1800; i++) { Sleep(2); } Out ...

  10. raid0和raid5的 实验过程

    raid:独立的磁盘冗余阵列 创建raid0: 环境准备:准备三块大小相同的磁盘或分区,此处要特别注意:红色字体 [root@localhost6 home]#fdisk /dev/sdd ##对/d ...