『嗨威说』算法设计与分析 - PTA 程序存储问题 / 删数问题 / 最优合并问题(第四章上机实践报告)
本文索引目录:
一、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 算法描述:
签到题,只需要将各个文件从小到大排序,并拿一个变量存储已占用的容量总和,进行对比即可得到结果。
- #include<bits/stdc++.h>
- #include<algorithm>
- using namespace std;
- #define MAXLENGTH 1000
- int interger[MAXLENGTH];
- int main()
- {
- int num,length;
- int sum = ;
- int counter = ;
- int m = ;
- cin>>num>>length;
- for(int i=;i<num;i++){
- cin>>interger[i];
- }
- sort(interger,interger+num);
- while(true){
- if(sum+interger[m]>length||counter==num)
- break;
- sum+=interger[m];
- counter++;
- m++;
- }
- cout<<counter<<endl;
- return ;
- }
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代码:
- #include<iostream>
- #include<algorithm>
- #include<string>
- using namespace std;
- #define MAXLENGTH 1005
- int main(){
- int k;
- string a;
- cin>>a>>k;
- int len = a.size();
- while(k>){
- for(int i = ;(i<a.size()-);i++){
- if(a[i]>a[i+])
- {
- a.erase(i,);
- break;
- }
- }
- k--;
- }
- while(a.size()>&&a[]==''){
- a.erase(,);
- }
- cout<<a<<endl;
- return ;
- }
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代码如下:
- #include<bits/stdc++.h>
- using namespace std;
- priority_queue<int> Haff;
- priority_queue<int, vector<int>, greater<int> > Haff2;
- int n,ans1,ans2;
- int main()
- {
- cin>>n;
- for(int i = ;i<n;i++)
- {
- int temp;
- cin>>temp;
- Haff.push(temp);
- Haff2.push(temp);
- }
- while()
- {
- if(Haff.size() == )
- break;
- int temp1 = Haff.top();
- Haff.pop();
- int temp2 = Haff.top();
- Haff.pop();
- Haff.push(temp1+temp2);
- ans1 += temp1+temp2-;
- }
- while()
- {
- if(Haff2.size() == )
- break;
- int temp1 = Haff2.top();
- Haff2.pop();
- int temp2 = Haff2.top();
- Haff2.pop();
- Haff2.push(temp1+temp2);
- ans2 += temp1+temp2-;
- }
- cout<<ans1<<" "<<ans2;
- return ;
- }
3.4 算法时间及空间复杂度分析:
由分析易知,虽然进行了两次优先队列维护,但是总的时间复杂度数量级是不变的,用O(n/2)的时间pop和push合成树。在优先队列里面用红黑树对顺序进行维护,时间复杂度为O(nlogn),最后将统计的结果输出,总的时间复杂度为O(nlogn)。
空间复杂度为两棵红黑树,即T(2n) = O(n)。
四、实验心得体会(实践收获及疑惑):
经过动态规划的肆虐之后,贪心算法变得稍微容易很多,和三木小哥哥的合作很愉快,能够很好较快及时的解决三道实践问题,暂无太多的问题,继续加油。
如有错误不当之处,烦请指正。
『嗨威说』算法设计与分析 - PTA 程序存储问题 / 删数问题 / 最优合并问题(第四章上机实践报告)的更多相关文章
- 『嗨威说』算法设计与分析 - PTA 数字三角形 / 最大子段和 / 编辑距离问题(第三章上机实践报告)
本文索引目录: 一.PTA实验报告题1 : 数字三角形 1.1 实践题目 1.2 问题描述 1.3 算法描述 1.4 算法时间及空间复杂度分析 二.PTA实验报告题2 : 最大子段和 2.1 实践题目 ...
- 『嗨威说』算法设计与分析 - 动态规划思想小结(HDU 4283 You Are the One)
本文索引目录: 一.动态规划的基本思想 二.数字三角形.最大子段和(PTA)递归方程 三.一道区间动态规划题点拨升华动态规划思想 四.结对编程情况 一.动态规划的基本思想: 1.1 基本概念: 动态规 ...
- 『嗨威说』算法设计与分析 - 贪心算法思想小结(HDU 2088 Box of Bricks)
本文索引目录: 一.贪心算法的基本思想以及个人理解 二.汽车加油问题的贪心选择性质 三.一道贪心算法题点拨升华贪心思想 四.结对编程情况 一.贪心算法的基本思想以及个人理解: 1.1 基本概念: 首先 ...
- 『嗨威说』算法设计与分析 - STL中Sort函数的实现原理初探
本文索引目录: 一.对Sort算法实现的个人阅读体会 二.Sort算法使用的三个排序算法的优点介绍 2.1 插入排序的优缺点 2.2 堆排序的优缺点 2.3 快速排序的优缺点 2.4 新的结合排序—— ...
- 『嗨威说』算法设计与分析 - 回溯法思想小结(USACO-cha1-sec1.5 Checker Challenge 八皇后升级版)
本文索引目录: 一.回溯算法的基本思想以及个人理解 二.“子集和”问题的解空间结构和约束函数 三.一道经典回溯法题点拨升华回溯法思想 四.结对编程情况 一.回溯算法的基本思想以及个人理解: 1.1 基 ...
- 『嗨威说』常见的C++函数模板整理(一)
开学两天,身上的职责直接变为两个班班长,三个小组组长,哇这事情估计够我忙活了,想躲都躲不掉啊,看来我还是真招人推荐各种管理职务啊,以后要是有人推荐我当经理啊领导啊该多好哈哈哈哈.记得今天奶奶生日,很开 ...
- 【技术文档】《算法设计与分析导论》R.C.T.Lee等·第7章 动态规划
由于种种原因(看这一章间隔的时间太长,弄不清动态规划.分治.递归是什么关系),导致这章内容看了三遍才基本看懂动态规划是什么.动态规划适合解决可分阶段的组合优化问题,但它又不同于贪心算法,动态规划所解决 ...
- 算法设计与分析 - AC 题目 - 第 5 弹(重复第 2 弹)
PTA-算法设计与分析-AC原题 - 最大子列和问题 (20分) 给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+, ..., Nj },其中 ≤i ...
- 算法设计与分析 - AC 题目 - 第 2 弹
PTA-算法设计与分析-AC原题7-1 最大子列和问题 (20分)给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+1, ..., Nj },其中 1 ...
随机推荐
- 小白学 Python(3):基础数据类型(下)
人生苦短,我选Python 引言 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 前面我们介绍过了数字,本篇我们接着聊另一个常用的基础数据类型:字符串. ...
- Java8新特性之Lambda
为什么要Lambda Java8应该是目前最大的一次更新了,更新后我们迎来了很多新特性,其中便包括Lambda表达式,函数式编程的思想正式进入Java,让我们看一个经典案例. 例1 按照两个人的年龄排 ...
- jquery 获取input的值
$("input").attr("value") -- 获取的是input的默认值 $("input").val() ...
- 算法---ALGO-3 Java K好数 蓝桥杯
package Main; import java.io.InputStream; import java.util.Scanner; public class Main { public stati ...
- 存储过程导出数据到csv
USE [database] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- P_AutoInspect_LogToFilePath 'F ...
- 使用unittest,if __name__ == '__main__':里代码不执行的解决办法
参考:https://www.cnblogs.com/hanmk/p/8656574.html
- C#类,对象,类成员简介
本节内容 1.类(class)是现实世界事物的模型 2.类与对象的关系,什么时候叫“对象”什么时候叫“实例” 3.引用变量与实例的关系 4.类的三大成员: ①属性(Property): ②方法(Met ...
- Arduino学习笔记⑤ 模拟IO实验
1.前言 还记得前几个我们都是在讲解数字IO,而其实我们生活中大多数信号都是模拟信号,如声音以及温度变化.在Arduino中,常用0~5v的电压来表示模拟信号. 1.1 模拟输入功能 ...
- 为什么要用dubbo,dubbo是什么,为什么要和zk结合使用?
目录 为什么要用dubbo dubbo是什么 dubbo架构 dubbo和zk关系 为什么要用dubbo? 随着互联网的发展,网站的应用规模不断扩大,常规的垂直架构已经无法应,分布式服务架构势在必行, ...
- fenby C语言P24
#include <stdio.h> int main(){ char cArr[]={'I','L','O','V','E','C'}; char sArr[]="ilovec ...