本文索引目录:

一、PTA实验报告题1 : 程序存储问题

  1.1  实践题目

  1.2  问题描述

  1.3  算法描述

  1.4  算法时间及空间复杂度分析

二、PTA实验报告题2 : 删数问题

  2.1  实践题目

  2.2  问题描述

  2.3  算法描述

  2.4  算法时间及空间复杂度分析

三、PTA实验报告题3 : 最优合并问题

  3.1  实践题目

  3.2  问题描述

  3.3  算法描述

  3.4  算法时间及空间复杂度分析

四、实验心得体会(实践收获及疑惑)

一、PTA实验报告题1 : 程序存储问题

  1.1  实践题目:

  1.2  问题描述:

      题意是,题干给定磁盘总容量和各个文件的占用空间,询问该磁盘最多能装几个文件。

  1.3  算法描述:

      签到题,只需要将各个文件从小到大排序,并拿一个变量存储已占用的容量总和,进行对比即可得到结果。

  1. #include<bits/stdc++.h>
  2. #include<algorithm>
  3. using namespace std;
  4. #define MAXLENGTH 1000
  5. int interger[MAXLENGTH];
  6. int main()
  7. {
  8. int num,length;
  9. int sum = ;
  10. int counter = ;
  11. int m = ;
  12. cin>>num>>length;
  13. for(int i=;i<num;i++){
  14. cin>>interger[i];
  15. }
  16. sort(interger,interger+num);
  17. while(true){
  18. if(sum+interger[m]>length||counter==num)
  19. break;
  20. sum+=interger[m];
  21. counter++;
  22. m++;
  23. }
  24. cout<<counter<<endl;
  25. return ;
  26. }

  1.4  算法时间及空间复杂度分析:

     整体算法上看,输入需要O(n)的时间进行输入,最快用O(nlogn)的时间复杂度进行排序,使用O(n)的时间进行结果叠加,总时间复杂度为O(nlogn),时间复杂度花费在排序上。

    空间上,只需要一个临时变量存储当前占用容量总和即可。

二、PTA实验报告题2 : 删数问题

  2.1  实践题目:

  2.2  问题描述:

    第二题题意是指,在给定的数字串以及可删数个数的条件下,删数指定k个数,得到的数是最小的。

  2.3  算法描述:

    首先,分析题目,删数问题,可以用一个比较方便的函数,String类的erase函数,这个函数可以删除字符串内的单个或多个字符,可以比较方便的处理删数问题。

    第二,我们注意到这道题有个坑点,那就是前导零,我们需要注意100000,删除1后结果应为0

    第三,确定我们的贪心策略:当当前的数,比后一位数大时,删去当前的数。

    如:样例178543

    用一个index时刻从头往后扫,不满足就后移。

    当满足之后,删除当前的值。

    得到17543,这时将index重新置0,并记录已删数+1,直到满足最大删数。以此类推,直接输出string便是结果。

    AC代码:

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<string>
  4. using namespace std;
  5. #define MAXLENGTH 1005
  6. int main(){
  7. int k;
  8. string a;
  9. cin>>a>>k;
  10. int len = a.size();
  11. while(k>){
  12. for(int i = ;(i<a.size()-);i++){
  13. if(a[i]>a[i+])
  14. {
  15. a.erase(i,);
  16. break;
  17. }
  18. }
  19. k--;
  20. }
  21. while(a.size()>&&a[]==''){
  22. a.erase(,);
  23. }
  24. cout<<a<<endl;
  25. return ;
  26. }

  2.4  算法时间及空间复杂度分析:

    时间复杂度为O(n^2),即开销在不断的删数和回溯到字符串头的过程。

    空间复杂度需要一个String字符串长度,因此空间复杂度是O(n)

三、PTA实验报告题3 : 最优合并问题

  3.1  实践题目:

  3.2  问题描述:

    该题目为:题目用 2 路合并算法将这k 个序列合并成一个序列,并且合并 2 个长度分别为m和n的序列需要m+n-1 次比较,输出某段合并的最大比较次数和最小比较次数。

  3.3  算法描述:

    这道题算是哈夫曼算法的一道裸题,很容易解决,只需要使用优秀队列不断维护最小值或最大值即可。

    哈夫曼树:是一颗最优二叉树。给定n个权值作为n个叶子的结点,构造一棵二叉树,若树的带权路径长度达到最小,这棵树则被称为哈夫曼树。

    因此本题根据哈夫曼算法,我们以最小比较次数为例:

    首先从队列中选出两个最小的数进行合并,并在队列中删除这两个数,并将新合成数加入队列中。

    再取最小的两个数再进行合并,以此类推,得到最终的大数如下

    因此最小比较次数为:( 7 - 1 ) + ( 18 - 1 ) + ( 30 - 1 ) =  52,即为所得。最大比较次数也是同理。

   AC代码如下:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. priority_queue<int> Haff;
  4. priority_queue<int, vector<int>, greater<int> > Haff2;
  5. int n,ans1,ans2;
  6.  
  7. int main()
  8. {
  9. cin>>n;
  10. for(int i = ;i<n;i++)
  11. {
  12. int temp;
  13. cin>>temp;
  14. Haff.push(temp);
  15. Haff2.push(temp);
  16. }
  17.  
  18. while()
  19. {
  20. if(Haff.size() == )
  21. break;
  22. int temp1 = Haff.top();
  23. Haff.pop();
  24. int temp2 = Haff.top();
  25. Haff.pop();
  26. Haff.push(temp1+temp2);
  27. ans1 += temp1+temp2-;
  28. }
  29.  
  30. while()
  31. {
  32. if(Haff2.size() == )
  33. break;
  34. int temp1 = Haff2.top();
  35. Haff2.pop();
  36. int temp2 = Haff2.top();
  37. Haff2.pop();
  38. Haff2.push(temp1+temp2);
  39. ans2 += temp1+temp2-;
  40. }
  41. cout<<ans1<<" "<<ans2;
  42. return ;
  43. }

  3.4  算法时间及空间复杂度分析:

    由分析易知,虽然进行了两次优先队列维护,但是总的时间复杂度数量级是不变的,用O(n/2)的时间pop和push合成树。在优先队列里面用红黑树对顺序进行维护,时间复杂度为O(nlogn),最后将统计的结果输出,总的时间复杂度为O(nlogn)。

   空间复杂度为两棵红黑树,即T(2n) = O(n)。

四、实验心得体会(实践收获及疑惑):

    经过动态规划的肆虐之后,贪心算法变得稍微容易很多,和三木小哥哥的合作很愉快,能够很好较快及时的解决三道实践问题,暂无太多的问题,继续加油。

如有错误不当之处,烦请指正。

『嗨威说』算法设计与分析 - PTA 程序存储问题 / 删数问题 / 最优合并问题(第四章上机实践报告)的更多相关文章

  1. 『嗨威说』算法设计与分析 - PTA 数字三角形 / 最大子段和 / 编辑距离问题(第三章上机实践报告)

    本文索引目录: 一.PTA实验报告题1 : 数字三角形 1.1 实践题目 1.2 问题描述 1.3 算法描述 1.4 算法时间及空间复杂度分析 二.PTA实验报告题2 : 最大子段和 2.1 实践题目 ...

  2. 『嗨威说』算法设计与分析 - 动态规划思想小结(HDU 4283 You Are the One)

    本文索引目录: 一.动态规划的基本思想 二.数字三角形.最大子段和(PTA)递归方程 三.一道区间动态规划题点拨升华动态规划思想 四.结对编程情况 一.动态规划的基本思想: 1.1 基本概念: 动态规 ...

  3. 『嗨威说』算法设计与分析 - 贪心算法思想小结(HDU 2088 Box of Bricks)

    本文索引目录: 一.贪心算法的基本思想以及个人理解 二.汽车加油问题的贪心选择性质 三.一道贪心算法题点拨升华贪心思想 四.结对编程情况 一.贪心算法的基本思想以及个人理解: 1.1 基本概念: 首先 ...

  4. 『嗨威说』算法设计与分析 - STL中Sort函数的实现原理初探

    本文索引目录: 一.对Sort算法实现的个人阅读体会 二.Sort算法使用的三个排序算法的优点介绍 2.1 插入排序的优缺点 2.2 堆排序的优缺点 2.3 快速排序的优缺点 2.4 新的结合排序—— ...

  5. 『嗨威说』算法设计与分析 - 回溯法思想小结(USACO-cha1-sec1.5 Checker Challenge 八皇后升级版)

    本文索引目录: 一.回溯算法的基本思想以及个人理解 二.“子集和”问题的解空间结构和约束函数 三.一道经典回溯法题点拨升华回溯法思想 四.结对编程情况 一.回溯算法的基本思想以及个人理解: 1.1 基 ...

  6. 『嗨威说』常见的C++函数模板整理(一)

    开学两天,身上的职责直接变为两个班班长,三个小组组长,哇这事情估计够我忙活了,想躲都躲不掉啊,看来我还是真招人推荐各种管理职务啊,以后要是有人推荐我当经理啊领导啊该多好哈哈哈哈.记得今天奶奶生日,很开 ...

  7. 【技术文档】《算法设计与分析导论》R.C.T.Lee等·第7章 动态规划

    由于种种原因(看这一章间隔的时间太长,弄不清动态规划.分治.递归是什么关系),导致这章内容看了三遍才基本看懂动态规划是什么.动态规划适合解决可分阶段的组合优化问题,但它又不同于贪心算法,动态规划所解决 ...

  8. 算法设计与分析 - AC 题目 - 第 5 弹(重复第 2 弹)

    PTA-算法设计与分析-AC原题 - 最大子列和问题 (20分) 给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+, ..., Nj },其中 ≤i ...

  9. 算法设计与分析 - AC 题目 - 第 2 弹

    PTA-算法设计与分析-AC原题7-1 最大子列和问题 (20分)给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+1, ..., Nj },其中 1 ...

随机推荐

  1. 为什么那么多自学JAVA的后来都放弃了?总结起来就这些原因

    目前信息化产业发展势头很好,互联网就成为了很多普通人想要涉及的行业,因为相比于传统行业,互联网行业涨薪幅度大,机会也多,所以就会大批的人想要转行来学习Java开发. 目前来讲市场上需要的Java人员非 ...

  2. JVM本地方法栈及native方法

    看到虚拟机栈和本地方法栈的区别的时候有点疑惑,因为本地方法栈为虚拟机的Native方法服务.以下转载一篇关于native方法的介绍: http://blog.csdn.net/wike163/arti ...

  3. Redis开发与运维:数据迁移(下)

    上一篇,有朋友留言redis-port,借此机会我尝试使用一下redis-port这个同步工具 redis-port 已编译版 https://github.com/CodisLabs/redis-p ...

  4. web安全之XSS基础-常见编码科普

    0x01常用编码 html实体编码(10进制与16进制): 如把尖括号编码[ < ]  -----> html十进制: <  html十六进制:< javascript的八进制 ...

  5. Spring Boot2 系列教程(十五)定义系统启动任务的两种方式

    在 Servlet/Jsp 项目中,如果涉及到系统任务,例如在项目启动阶段要做一些数据初始化操作,这些操作有一个共同的特点,只在项目启动时进行,以后都不再执行,这里,容易想到web基础中的三大组件( ...

  6. Python编程系列---使用装饰器传参+字典实现动态路由

    # 实现一个空路由表,利用装饰器将url和功能函数的对应关系自动存到这个字典中 router_dict = {} # 定义一个装饰器 # 再给一层函数定义,用来传入一个参数,这个参数就是访问的页面地址 ...

  7. 电脑扫描不出u盘的解决办法

    现象:u盘已插上但是设备和驱动器里却找不到 解决办法: 首先记下u盘名称,然后 我的电脑-右键-管理-设备管理器,找到u盘,卸载设备后重新插入u盘即可

  8. 百万年薪python之路 -- 装饰器

    装饰器 1.1 开放封闭原则 开放封闭原则具体定义是这样: 1.对扩展是开放的 我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改.所以我们必须允许代码扩展.添加新 ...

  9. springboot pagehelper分页无效

    springboot pagehelper分页无效 遇到的问题把所有的数据都查出来了 -然后跟踪代码发现PageHelper.startPage没有生效,生成的sql也没有分页的信息 依赖也引入了 & ...

  10. solr学习篇(三) solr7.4 连接MySQL数据库

    目录 导入相关jar包 配置连接信息 将数据库导入到solr中 验证是否成功 创建一个Core,创建Core的方法之前已经很详细的讲解过了,如果还是不清楚请参考 solr7.4 安装配置篇: 1.导入 ...