算法第四章上机实践报告

一、实践题目:删数问题

二、问题描述:

给定一个n位的正整数a,去掉其中任意k(k≤n) 个数字后,剩下的数字按照原次序排列成一个的新的正整数。在给定的n位正整数a和正整数k的情况下,输出完成该操作后剩下的正整数。

三、算法描述:

正整数的位数不定,用long long去存不一定存的下,所以用一个字符数组str[]来存储。此处运用一种贪心策略,不停的对这个整数进行扫描,当发现当前位的后一位比当前位小的情况,将当前位删除(例如1873,删除8肯定比删除7更优),若所有位数的数字按照升序排列,则删除最后一位。注意要将字符串前导的0删除掉,故要对得到的新数组进行分类讨论。

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 char str[1005];
 5 int main(){
 6     int k,flag=1;
 7     cin>>str>>k;
 8     int len=strlen(str);
 9     int temp=len;//temp用于记录已经保留的位数
10     while(temp!=len-k){
11         for(int i=0;i<len;i++){
12             if(str[i]>str[i+1]){
13                 for(int j=i;j<len;j++){
14                     str[j]=str[j+1];
15                 }
16                 temp--;
17                 break;
18             }
19         }
20     }
21     if(temp==0){
22         cout << ‘0‘;
23     }
24     else{
25         for(int i=0;i<len-k;i++){
26             if(str[i]==‘0‘&&i==(len-k-1)){
27                 cout <<‘0‘;
28             }
29             else if(str[i]==‘0‘&&flag==1){
30                 continue;
31             }
32             else{
33                 flag++;
34                 cout<<str[i];
35             }
36         }
37     }
38 }   

四、算法分析

时间复杂度:这段代码在一个长度为n的数组中删除k个,进行了k次的扫描,故循环的次数为k,时间复杂度为O(kn),最后输出结果的时候对剩余的位数进行了一次“去0操作”,复杂度为O(n-k),因为k为整数,故综合的时间复杂度为O(n)。

空间复杂度:运用了一个字符型数组进行存储,故空间复杂度为O(n)。

五、心得体会

第三题时队友将问题过分复杂化了,以为是一个0-1背包,后来经过讨论觉得只需将数组进行排列,从小到大放入即可。在做这道题的时候,在贪心策略方面想的比较久,在有思路后处理字符串删除的过程中又出现了问题,并且在答案错误后发现遗漏了全删和前导0的情况,又增加了一些代码。这道题考察了许多的细节,而且贪心策略也不是非常的明显,让我们在结对编程中更加注意细节,更加的耐心。

原文地址:https://www.cnblogs.com/Benboys/p/10048884.html

时间: 2024-07-31 09:40:42

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

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

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

揭露动态规划真面目——算法第三章上机实践报告

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

第四章上机实践报告

一:实践题目: 删数问题 (110 分) 给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新 的正整数.对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最 小的删数方案. 输入格式: 第 1 行是1 个正整数 a.第 2 行是正整数k. 输出格式: 输出最小数. 输入样例: 在这里给出一组输入.例如: 178543 4 输出样例: 在这里给出相应的输出.例如: 13 二:问题描述: 使用贪心算法的思想每次选择从头开始递增的数字中最大的数字 即一

算法第5章上机实践报告

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

算法第五章上机实践报告

一 . 实践题目 7-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 三 . 算法描述 1. 解空间 第一个人选择第几个工作,第

算法第3章上机实践报告

1.实践题目  7-1 数字三角形 2.问题描述 给定一个由 n行数字组成的数字三角形如下图所示.试设计一个算法, 计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大. 3.算法描述 求以一个的数为顶至底的数字总和 等于求以这个数左边或右边的数为顶至底的数字总和的最大值加上这个数本身 得出递推方程 m[i][j]=max( m[i+1][j], max[i+1][j+1] )+a[i][j] 从下至上填表 4.算法时间及空间复杂度分析 双重循环对维

算法第三章上机实践报告

实践题目 7-1 数字三角形 (30 分) 给定一个由 n行数字组成的数字三角形如下图所示.试设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大. 输入格式: 输入有n+1行: 第 1 行是数字三角形的行数 n,1<=n<=100. 接下来 n行是数字三角形各行中的数字.所有数字在0..99 之间. 输出格式: 输出最大路径的值. 输入样例: 在这里给出一组输入.例如: 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5

算法第三章上机实践报告之数字三角形

1.实践题目 7-1 数字三角形 (30 分) 给定一个由 n行数字组成的数字三角形如下图所示.试设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大. 输入格式: 输入有n+1行: 第 1 行是数字三角形的行数 n,1<=n<=100. 接下来 n行是数字三角形各行中的数字.所有数字在0..99 之间. 输出格式: 输出最大路径的值. 输入样例: 在这里给出一组输入.例如: 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6

算法第三章上机实践报告——动态规划

1.实践题目 7-1 数字三角形 (30 分) 给定一个由 n行数字组成的数字三角形如下图所示.试设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大. 输入格式: 输入有n+1行: 第 1 行是数字三角形的行数 n,1<=n<=100. 接下来 n行是数字三角形各行中的数字.所有数字在0..99 之间. 输出格式: 输出最大路径的值. 输入样例: 在这里给出一组输入.例如: 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6