算法第四章上机实验报告
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在哪。
浙公网安备 33010602011771号