算法第四章实践报告

1.选择第二题进行分析。

给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新 的正整数。对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最 小的删数方案。

输入

178543
4 输出132.问题描述:就是删掉指定数字中的一些数字,然后重新组成一个新的数使得这个数达到最小。3.算法描述:这个问题第一眼看下去容易想到对数组不停的排序然后不断删掉最大的,但是按着这个思路去做却发现,不断提取整型数组然后排序会比较复杂,因为要不断求余数等等,而且代码不好写。后来发现使用串数组解决这个问题会比较的容易,而且删除对应的字符可以直接调用str.erase的函数来做,就简单很多。通过做贪心选择,不断地把S【i】>s[i+1]的对应s【i】字符删掉,最后如果要删掉的字符数目比这个过程实际上多出几个,就删掉最后面的几个,就可以了,输出方面要注意将‘0’字符输出注意一下。4.代码如下:

#include<string>
#include<iostream>
using namespace std;
int n;
string s;
int main()
{

cin>>s>>n;
int fin_del=0;
for(int j=0;j<n;j++){
for(int i=0;i<s.size()-1;i++)
{
if(s[i+1]<s[i])
{
s.erase(i,1);
fin_del++;
break;
}
}
}
if(n-fin_del!=0){
s.erase(s.size()-(n-fin_del)+1,s.size());
}
bool F=false;

for(int i=0;i<s.size();i++)
{
if(s[i]!=‘0‘ || i==s.size()-1)
F=true;
if(F)
printf("%c",s[i]);
}
}空间复杂度的话由于是解决问题是在一维数组解决的,所以是O(n);

时间复杂度:为 O(n*(n-1)+n) 即O(n*n) 第一个式子就是比较所用的时间,第二个式子是输出字符用的时间,总的时间复杂度是O(n*n);

心得体会:个人觉得三道实践题中,这道题目是最困难的,因为老想着余数法来把对应数字提取出来再不断排序删除,实际上这里如果能很好的利用字符数字,数字大,ASC2页大的实质,再利用String的erase函数就可以很直接的对数组做出删除。



原文地址:https://www.cnblogs.com/suanfasfather/p/10034215.html

时间: 2024-10-07 16:46:49

算法第四章实践报告的相关文章

算法的第四章实践报告

分析程序存储问题.内容包括:   1. 实践题目 设有n 个程序要存放在长度为L的磁带上.各个程序存放在磁带上的长度已列出. 程序存储问题要求确定使得n  个程序能够在磁带上存储尽可能多的程序的一个存储方案.       2.问题描述 要求每次选择长度最小的程序放入磁带中,使得能放入的程序量最多       3.算法描述(说明你的贪心策略,并且参考会场安排问题,利用反证法证明贪心选择和最优子结构性质) 每次选择剩下的程序中长度最小的程序,如会场安排问题,按小集合排在前来遍历,也即是“贪心策略”.

【实践报告】算法第三章实践报告

1.实践题目 7-2最大子段和 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的子段和的最大值.当所给的整数均为负数时,定义子段和为0. 要求算法的时间复杂度为O(n). 2.问题描述 输入格式: 输入有两行: 第一行是n值(1<=n<=10000): 第二行是n个整数. 输出格式: 输出最大子段和. 输入样例: 在这里给出一组输入.例如: 6 -2 11 -4 13 -5 -2 输出样例: 在这里给出相应的输出.

算法第4章实践报告

1.实践题目 7-3 程序存储问题 (90 分) 2.问题描述 设有n 个程序{1,2,-, n }要存放在长度为L的磁带上.程序i存放在磁带上的长度是 li,1≤i≤n. 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序. 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数. 输入格式: 第一行是2 个正整数,分别表示文件个数n和磁带的长度L.接下来的1行中,有n个正整数,表示程序存放在磁带上的长度. 输出格式: 输出最多可以存储的

算法 第四章实践

1.实践题目 程序存储问题 2.问题描述 设有n 个程序{1,2,-, n }要存放在长度为L的磁带上.程序i存放在磁带上的长度是 li,1≤i≤n. 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序. 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数. 3.算法描述 for(int i=0;i<n;i++) cin>>a[i];//将程序的长度存放在数组之中 sort(a,a+n);//将数组中的元素排序 int num=

算法第五章实践报告

1. 实践题目 工作分配问题 2. 问题描述 设有n件工作分配给n个人.将工作i分配给第j个人所需的费用为cij . 设计一个算法,对于给定的工作费用,为每一个人都分配1 件不同的工作,并使总费用达到最小. 输入格式: 输入数据的第一行有1 个正整数n (1≤n≤20).接下来的n行,每行n个数,表示工作费用. 输出格式: 将计算出的最小总费用输出到屏幕. 输入样例: 在这里给出一组输入.例如: 3 10 2 3 2 3 4 3 4 5 输出样例: 在这里给出相应的输出.例如:   9 3. 算

算法第三章实践报告

1.最大子段和. 2.给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的子段和的最大值.当所给的整数均为负数时,定义子段和为0. 要求算法的时间复杂度为O(n). 3. #include<iostream>using namespace std; int maxi(int a[],int n){ int sum,maxsum; int i; sum=maxsum=0; for(i =0;i<n;i++) { s

第四章实践报告

7-1最优合并问题 1.问题描述: 给定k 个排好序的序列, 用 2 路合并算法将这k 个序列合并成一个序列. 假设所采用的 2 路合并算法合并 2 个长度分别为m和n的序列需要m+n-1 次比较.试设 计一个算法确定合并这个序列的最优合并顺序,使所需的总比较次数最少. 为了进行比较,还需要确定合并这个序列的最差合并顺序,使所需的总比较次数最多. 输入格式:第一行有 1 个正整数k,表示有 k个待合并序列. 第二行有 k个正整数,表示 k个待合并序列的长度. 输出格式:输出最多比较次数和最少比较

贪心算法?我全都要!——算法第四章上机实践报告

算法第四章上机实践报告 一.        实践题目 4-1 程序存储问题 (90 分) 设有n 个程序{1,2,…, n }要存放在长度为L的磁带上.程序i存放在磁带上的长度是 li,1≤i≤n. 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序. 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数. 输入格式: 第一行是2 个正整数,分别表示文件个数n和磁带的长度L.接下来的1行中,有n个正整数,表示程序存放在磁带上的长度. 输出

数据结构与算法 第四次实验报告 图

数据结构与算法 第四次实验报告 姓名:许恺 学号:2014011329 班级:计算机14-1     中国石油大学(北京)计算机科学与技术系 1.图的定义,文件为"Graph.h" #ifndef GRAPH_H//定义头文件 #define GRAPH_H #include<string>//引入标准库中的头文件 using namespace std; const int MaxSize=12; struct ArcNode//定义边表结点 { int adjvex;/