T1铺设道路

传送门

题目描述

春春是一名道路工程师,负责铺设一条长度为 $ n $ 的道路。

铺设道路的主要工作是填平下陷的地表。整段道路可以看作是 $ n $ 块首尾相连的区域,一开始,第 ii 块区域下陷的深度为 $ d[i] $ 。

春春每天可以选择一段连续区间 $ [L,R] $ ,填充这段区间中的每块区域,让其下陷深度减少 $ 1 $ 。在选择区间时,需要保证,区间内的每块区域在填充前下陷深度均不为 $ 0 $ 。

春春希望你能帮他设计一种方案,可以在最短的时间内将整段道路的下陷深度都变为 $ 0 $ 。

输入输出格式

输入格式:

输入文件包含两行,第一行包含一个整数 $ n $ ,表示道路的长度。 第二行包含 $ n $ 个整数,相邻两数间用一个空格隔开,第 $ i $ 个整数为 $ d[i]$​ 。

输出格式:

输出文件仅包含一个整数,即最少需要多少天才能完成任务。

输入输出样例

输入样例

6

4 3 2 5 3 5

输出样例

9

说明

【样例解释】

一种可行的最佳方案是,依次选择: $ [1,6] $ , $ [1,6] $ , $ [1,2] $ , $[1,1] $ , $ [4,6] $ , $ [4,4] $ , $ [4,4] $ , $ [6,6] $ , $ [6,6] $ 。

【数据规模与约定】

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

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

对于 $ %100 $ 的数据,$ 1 ≤ n ≤ 100000 $ , $ 0 ≤ d[i]≤ 10000 $

分析:

整体想法是用一个 $ while $ 循环来控制指针,找出每一段不上升的子序列,将这些子序列中的第一个数加起来,因为这个数是这一段子序列中最大值,所以这个数就是这一整个序列铺设道路所用的最少时间,然后加起来就好了。

还有我觉得开始处理或者是不处理出一个最小值都没有关系。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <set>
  6. #include <queue>
  7. #include <map>
  8. #include <cmath>
  9. #define re register
  10. using namespace std ;
  11. const int maxn = 100005 ;
  12. inline int read() {
  13. int f = 1 , x = 0 ;
  14. char ch = getchar() ;
  15. while(ch < '0' || ch > '9') {if(ch == '-') f = -1 ; ch = getchar() ;}
  16. while(ch >= '0' && ch <= '9') {x = (x << 1) + (x << 3) + ch - '0' ;ch = getchar() ;}
  17. return x * f ;
  18. }
  19. int n , h[maxn] ;
  20. int tmp , ans , minn = 1e9 ;
  21. int main() {
  22. n = read() ;
  23. for(re int i = 1 ; i <= n ; ++i) {
  24. h[i] = read() ;
  25. minn = min(minn , h[i]) ;
  26. }
  27. ans += minn ;
  28. for(re int i = 1 ; i <= n ; ++i) h[i] -= minn ;
  29. int j = 1 ;
  30. while(h[j] == 0) j++ ;
  31. int wh = 0 , m = 1e9 ;
  32. while(j <= n) {
  33. m = h[j] ;
  34. ans += (h[j] - h[wh]) ;
  35. for(int i = j ; i <= n ; ++i) {
  36. if(h[i] <= m) {
  37. m = h[i] ;
  38. wh = i ;
  39. }
  40. else break;
  41. }
  42. j = wh + 1;
  43. }
  44. printf("%d\n" , ans) ;
  45. return 0 ;
  46. }

T2货币系统

传送门啦

题目描述

在网友的国度中共有 $ n $ 种不同面额的货币,第 $ i $ 种货币的面额为 $ a[i] $ ,你可以假设每一种货币都有无穷多张。为了方便,我们把货币种数为 $ n $ 、面额数组为 $ a[1..n] $ 的货币系统记作 $ (n,a) $ 。

在一个完善的货币系统中,每一个非负整数的金额 $ x $ 都应该可以被表示出,即对每一个非负整数 $ x $ ,都存在 $ n $ 个非负整数 $ t[i] $ 满足 $ a[i] \times t[i] $ 的和为 $ x $ 。然而, 在网友的国度中,货币系统可能是不完善的,即可能存在金额 $ x $ 不能被该货币系统表示出。例如在货币系统 $ n=3, a=[2,5,9] $ 中,金额 $ 1,3 $ 就无法被表示出来。

两个货币系统 $ (n,a) $ 和 $ (m,b) $ 是等价的,当且仅当对于任意非负整数 $ x $ ,它要么均可以被两个货币系统表出,要么不能被其中任何一个表出。

现在网友们打算简化一下货币系统。他们希望找到一个货币系统 $ (m,b) $ ,满足 $ (m,b) $ 与原来的货币系统 $ (n,a) $ 等价,且 $ m $ 尽可能的小。他们希望你来协助完成这个艰巨的任务:找到最小的 $ m $ 。

输入输出格式

输入格式:

输入文件的第一行包含一个整数 $ T $ ,表示数据的组数。

接下来按照如下格式分别给出 $ T $ 组数据。 每组数据的第一行包含一个正整数 $ n $ 。接下来一行包含 $ n $ 个由空格隔开的正整数 $ a[i] $

输出格式:

输出文件共有 $ T $ 行,对于每组数据,输出一行一个正整数,表示所有与 $ (n,a) $ 等价的货币系统 $ (m,b) $ 中,最小的 $ m $ 。

输入输出样例

输入样例:

2

4

3 19 10 6

5

11 29 13 19 17

输出样例:

2

5

说明

在第一组数据中,货币系统 $ (2, [3,10]) $ 和给出的货币系统 $ (n, a) $ 等价,并可以验证不存在 $ m < 2 $ 的等价的货币系统,因此答案为 $ 2 $ 。 在第二组数据中,可以验证不存在 $ m<n $ 的等价的货币系统,因此答案为 $ 5 $ 。

分析:

首先相同的数字肯定是没有意义的,我们对原数组进行去重,然后我们用一个数组 $ vis[i] $ 表示数字 $ i $ 是否能够表示,如果 $ vis[i]=true $ 可以表示,否则不可以表示。那么我们就对于 $ n $ 个数中的每一个数字进行判断,第一个 $ a[0] $ 肯定不能表示,那么我们结果 $ ans++ $ , 然后把 $ a[0] $ 能够表示的数字 $ i $ 全标记为 $ vis[i]=true $ ;那么在检查第 $ i $ 个数字,如果能够用已经标记的数字表示,那么说明这个数可以用 之前的数表示,答案不记录;否则答案记录,而且将已经能够表示的数字加上 $ a[i] $ ,也进行标记 $ vis[j+a[i]]=true $ ,直至循环完毕,输出 $ ans $ 即可。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <set>
  6. #include <queue>
  7. #include <map>
  8. #include <vector>
  9. #include <cmath>
  10. #define re register
  11. using namespace std ;
  12. const int maxn = 105 ;
  13. const int Maxn = 25005 ;
  14. inline int read() {
  15. char ch = getchar() ;
  16. int f = 1 , x = 0 ;
  17. while(ch > '9' || ch < '0') {if(ch == '-') f = -1 ; ch = getchar() ;}
  18. while(ch >= '0' && ch <= '9') {x = (x << 1) + (x << 3) + ch - '0' ; ch = getchar() ;}
  19. return x * f ;
  20. }
  21. int T , n , a[maxn];
  22. int f[maxn] , ans;
  23. bool vis[Maxn] ;
  24. int main() {
  25. T = read() ;
  26. while(T--) {
  27. n = read() ;
  28. memset(a , 0 , sizeof(a)) ;
  29. for(re int i = 1 ; i <= n ; ++i) {
  30. a[i] = read() ;
  31. }
  32. sort(a + 1 , a + 1 + n) ;
  33. n = unique(a + 1 , a + 1 + n) - a - 1;
  34. memset(vis , false , sizeof(vis)) ;
  35. vis[0] = true ;
  36. ans = 0 ;
  37. for(re int i = 1 ; i <= n ; ++i) {
  38. if(!vis[a[i]]) {
  39. ans ++ ;
  40. for(re int j = 0 ; j < Maxn ; ++j)
  41. if(j + a[i] < Maxn && vis[j])
  42. vis[j + a[i]] = true ;
  43. }
  44. }
  45. printf("%d\n" , ans) ;
  46. }
  47. return 0 ;
  48. }

NOIp 2018 提高组的更多相关文章

  1. NOIP 2018 提高组初赛解题报告

    单项选择题: D 进制转换题,送分: D 计算机常识题,Python是解释运行的: B 常识题,1984年小平爷爷曰:“娃娃抓起”: A 数据结构常识题,带进去两个数据就可以选出来: D 历年真题没有 ...

  2. NOIP 2018 提高组初赛试题 题目+答案+简要解析

    一.单项选择题(共 10  题,每题 2  分,共计 20  分: 每题有且仅有一个正确选项)       1. 下列四个不同进制的数中,与其它三项数值上不相等的是( ). A. (269) 16 B ...

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

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

  4. [NOIp 1998 提高组]Probelm 2 连接多位数【2011百度实习生笔试题】

    /*====================================================================== [NOIp 1998 提高组]Probelm 2 连接 ...

  5. NOIP 2014 提高组 题解

    NOIP 2014 提高组 题解 No 1. 生活大爆炸版石头剪刀布 http://www.luogu.org/problem/show?pid=1328 这是道大水题,我都在想怎么会有人错了,没算法 ...

  6. NOIP 2001 提高组 题解

    NOIP 2001 提高组 题解 No 1. 一元三次方程求解 https://vijos.org/p/1116 看见有人认真推导了求解公式,然后猥琐暴力过的同学们在一边偷笑~~~ 数据小 暴力枚举即 ...

  7. 最优贸易 NOIP 2009 提高组 第三题

    题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分 为双向通行的道路 ...

  8. NOIP 2006 提高组 t1 能量项链

    题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定 ...

  9. NOIP 2018 普及组 解题报告

    目录 标题统计 题目链接 思路 代码 龙虎斗 题目链接: 思路 代码 摆渡车 题目链接: 思路 对称二叉树 题目链接 思路: 先来解释一下为毛现在才来发解题报告: 其实博主是参加过NOIP 2018普 ...

随机推荐

  1. dubbo的spi机制

    SPI SPI是一种扩展机制,在java中SPI机制被广泛应用,比如Spring中的SpringServletContainerInitializer 使得容器启动的时候SpringServletCo ...

  2. git查看各个branch之间的关系

    1.pull所有branch for remote in `git branch -r `; do git branch --track $remote; done for remote in `gi ...

  3. MT【101】分配问题举例若干

    先拿MT[100]的图表镇楼. 举几个例子: [1]52张纸牌分发给4人,每人13张,问每人手中有一张小2的概率? 分析:第一步每人分一张小2,有4!种,然后48张牌平均分成4组有$\frac{48! ...

  4. gdb调试coredump文件

    linux上程序崩溃起来挺烦人,不过linux 比较好的是有gdb. 1.生成coredump文件 echo "ulimit -c unlimited" >> /etc ...

  5. 【COGS1752】 BOI2007—摩基亚Mokia

    http://cogs.pro/cogs/problem/problem.php?pid=1752 (题目链接) 题意 给出$n*n$的棋盘,单点修改,矩阵查询. Solution 离线以后CDQ分治 ...

  6. SQL Server 行列相互转换命令:PIVOT和UNPIVOT使用详解

    一.使用PIVOT和UNPIVOT命令的SQL Server版本要求 1.数据库的最低版本要求为SQL Server 2005 或更高. 2.必须将数据库的兼容级别设置为90 或更高. 3.查看我的数 ...

  7. null和System.DBNull.Value的区别

    我记得之前在写一个程序的时候用到了这个知识点,当时判断的时候,有时候null可以,有时候必须是System.DBNull.Value 由于不清楚这两个的区别所以纠结了很久.查了一下,二者的区别如下: ...

  8. IIS发布MVC出错

    一个MVC网站在发布到IIS上时,出现了这个问题: 然后解决办法: 然后应用程序池那里,自己点右键添加一个 新建完应用池之后选中点高级设置 最后,添加网站,添加网站的时候应用程序池选择自己刚刚新建的那 ...

  9. Sql数据库不能频繁连接

    这个问题怎么说呢,我频繁的读一个json文件,所以就频繁的去连接了数据库.所以导致了数据库后来就不工作了(罢工?O(∩_∩)O哈哈~) 解决办法是加一个判断语句,如果是空的就连接,否则就别一直连接了. ...

  10. 比特币全节点(bitcoind) eth 全节点

    运行全节点的用途:  1.挖矿  2.钱包   运行全节点,可以做关于btc的任何事情,例如创建钱包地址.管理钱包地址.发送交易.查询全网的交易信息等等 选个节点钱包:bitcoind 1.配置文件: ...