c语言:删数问题,贪心算法,『嗨威说』算法设计与分析 - 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  实践题目:

66c847cce9825dba536dab033d1e42c2.png

1.2  问题描述:

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

1.3  算法描述:

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

#include

#include

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

cin>>interger[i];

}

sort(interger,interger+num);

while(true){

if(sum+interger[m]>length||counter==num)

break;

sum+=interger[m];

counter++;

m++;

}

cout<

return ;

}

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

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

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

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

2.1  实践题目:

971c564e3e6de1402cfd34612cc12697.png

2.2  问题描述:

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

2.3  算法描述:

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

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

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

如:样例178543

1a0bbbba88816e32ec26ec7aa84b7336.png

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

7802cb889ec95550046972f76c0e27c4.png

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

9ad5a1cceca7f459d97abf8638255d5f.png

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

AC代码:

#include

#include

#include

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

if(a[i]>a[i+])

{

a.erase(i,);

break;

}

}

k--;

}

while(a.size()>&&a[]==''){

a.erase(,);

}

cout<

return ;

}

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

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

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

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

3.1  实践题目:

81b367c9f270a1f073f74ae83800ee48.png

3.2  问题描述:

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

3.3  算法描述:

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

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

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

8095c3f20110943fdb4d1cfcc410019a.png

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

e81118da534da04650a997a8e632f9a5.png

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

20306a06b567596cbe0f88ff6986d0d5.png

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

AC代码如下:

#include

using namespace std;

priority_queue Haff;

priority_queue, greater > Haff2;

int n,ans1,ans2;

int main()

{

cin>>n;

for(int i = ;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<

return ;

}

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

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

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

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

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

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

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

本文索引目录: 一.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&period;5 Checker Challenge 八皇后升级版)

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

『嗨威说』常见的C&plus;&plus;函数模板整理(一)

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

【技术文档】《算法设计与分析导论》R&period;C&period;T&period;Lee等&&num;183&semi;第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 ...

随机推荐

&lbrack;Derby&rsqb;数据库操作说明

1. 创建新数据库 connect 'jdbc:derby:mydb;create=true'; ij> connect 'jdbc:derby:mydb;create=true'; ij&gt ...

Java基础&lpar;40&rpar;&colon;Java中的集合介绍---Collection与Map

集合类说明及区别Collection├List│├LinkedList│├ArrayList│└Vector│ └Stack└SetMap├Hashtable├HashMap└WeakHashMap ...

hdoj 2524 矩形A &plus; B

矩形A + B Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

&period;Net 4&period;5 Task

Task 是 .Net4.0 新出的异步调用方法,粗略看了一下基本对外屏蔽了线程的概念,写异步调用更专注于应用本身. public class Program { static void Main(s ...

Android: ADT 23&period;0&period;2

http://pan.baidu.com/s/1gdnBUUJ 版权声明:本文博主原创文章.博客,未经同意不得转载.

C&plus;&plus;中的纯虚方法

在学习数据结构中优先级队列时遇到纯虚方法的定义,一时没想起来,便查了一下. 1.纯虚方法解决什么样的问题,为什么要设计出纯虚方法? 考虑下面的需求,基类声明了一个方法,这个方法只针对具体的子类才有意义 ...

基于mykernel的时间片轮转调度

学号: 363 原创作品,转载请注明出处.本实验资源来源: https://github.com/mengning/linuxkernel/ 一. 实验环境配置 本次实验在实验楼完成: 在实验楼的终端 ...

mysql主从&lpar;主备&rpar;同步一键配置&comma;配自动检测功能

主从一键shell配置 做个笔记. #!/bin/bash #Mysql sync #chenglee #master机器ip MasterIP="192.168.137.174" ...

14&period;Mysql事务控制和锁定

14.事务控制和锁定存储引擎和锁: MyISAM和MEMORY存储引擎的表支持表级锁: BDB存储引擎的表支持页级锁: InnoDB存储引擎的表支持行级锁.默认情况下,表锁和行锁都是根据执行的语句自动 ...

Bootstrap Table 超多列 使用滚动条

overflow-x: scroll;横向滑动详细讲解 able显示滚动条,要先把table放到一个div中,控制div 属性overflow值为scroll

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值