算法第四章上机实验报告
2021/11/13 20:40:11
本文主要是介绍算法第四章上机实验报告,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
4-1 程序存储问题 (40 分)
题目:设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是 li,1≤i≤n。
程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序。
对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。
输入格式:
第一行是2 个正整数,分别表示文件个数n和磁带的长度L。接下来的1行中,有n个正整数,表示程序存放在磁带上的长度。
输出格式:
输出最多可以存储的程序数。
输入样例:
在这里给出一组输入。例如:
6 50 2 3 13 8 80 20结尾无空行
输出样例:
在这里给出相应的输出。例如:
5
结尾无空行
#include <iostream> #include <algorithm> using namespace std; int main(){ int n,l; cin>>n; cin>>l; int count=0; int size[n+1]; for(int i = 0; i< n; i++){ cin>>size[i]; } sort(size,size+n); for(int i = 0; i<n; i++){ if(size[i]<=l){ l -= size[i]; count++; } else break; } cout<<count; }
贪心策略,将占用资源最小的放入磁带中。
4-2 删数问题 (30 分)
给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新的正整数。对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最小的删数方案。如果数字最前面有0不输出。
输入格式:
第 1 行是1 个正整数 a。第 2 行是正整数k。
输出格式:
输出最小数。
输入样例:
在这里给出一组输入。例如:
178543 4结尾无空行
5001 1
结尾无空行
123456 2
结尾无空行
109 1
结尾无空行
输出样例:
在这里给出相应的输出。例如:
13
结尾无空行
1
结尾无空行
1234
结尾无空行
9
结尾无空行 代码:
#include <bits/stdc++.h> using namespace std; int maxn=1e3+5; char a[maxn]; int k; int main(){ cin>>a; cin>>k; int n=strlen(a); int i=0; while(k>0){ while(a[i]<=a[i+1]) i++; for(int j=i;j<n-1;j++) a[j]=a[j+1]; i--; n--; k--; } int flag=1; for(int i=0;i<n;i++){ if(a[i]=='0'&&flag&&i<n-1) continue; else { cout<<a[i]; flag=0; } } return 0; }
贪心策略:从左到右去掉比下一位数大的数字。如何去掉数组中的某一位数代码花费较多的时间调试,这点需要好好学习加强。
注意:输出时去掉数字前的0。
4-3 最优合并问题 (30 分)
题目来源:王晓东《算法设计与分析》
给定k 个排好序的序列, 用 2 路合并算法将这k 个序列合并成一个序列。 假设所采用的 2 路合并算法合并 2 个长度分别为m和n的序列需要m+n-1 次比较。试设 计一个算法确定合并这个序列的最优合并顺序,使所需的总比较次数最少。 为了进行比较,还需要确定合并这个序列的最差合并顺序,使所需的总比较次数最多。
输入格式:
第一行有 1 个正整数k,表示有 k个待合并序列。 第二行有 k个正整数,表示 k个待合并序列的长度。
输出格式:
输出最多比较次数和最少比较次数。
输入样例:
在这里给出一组输入。例如:
4 5 12 11 2结尾无空行
输出样例:
在这里给出相应的输出。例如:
78 52
结尾无空行 代码:
#include<iostream> #include<algorithm> using namespace std; bool cmp(int a, int b){ return a>b; } int main(){ int k; cin>>k; int num[1000] = {0}; int sum=0,sum2 = 0; int now=0; for(int i=0;i<k;i++){ cin>>num[i]; } int num2[1000]; for(int i=0;i<k;i++){ num2[i] = num[i]; } sort(num,num+k); for(int i=0;i<k-1;i++){ now=num[i]+num[i+1]-1; num[i+1] = now+1; sum+=now; } sort(num2,num2+k,cmp); now = 0; for(int i=0;i<k-1;i++){ now=num2[i]+num2[i+1]-1; num2[i+1] = now+1; sum2+=now; } cout<<sum2<<" "<<sum; }
贪心策略:排序 然后按题目要求相加。但是以上代码未通过所有测试点,暂未找到bug在哪。
这篇关于算法第四章上机实验报告的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南